HDU 2842 遞推 矩陣快速冪

2021-09-08 11:01:05 字數 1357 閱讀 8031

題目大意:棒子上套環。第i個環能拿下的條件是:第i-1個環在棒子上,前i-2個環不在棒子上。每個環可以取下或放上,cost=1。求最小cost。mod 200907。

解題思路

題目意思非常無聊,感覺是yy的。

設$dp[i]$為取第i個環時的總cost。

$dp[1]=1$,$dp[2]=2$,前兩個環取下是沒有條件要求的。

從i=3開始,由於條件對最後的環限制最大,所以從最後乙個環開始取。

$p[3]=5$(先取下第乙個環,然後第三個環,然後放上第乙個環,然後取下第二個環,然後取下第乙個環)

$dp[4]=10$(規律是:取i環花費1,依賴花費$dp[i-1]$、$2*dp[i-2]$)

所以$dp[i]=dp[i-1]+2*dp[i-2]+1$

任何遞推數列都能構造矩陣求解,有n個引數的通項公式,至少需要構造$1*n$的矩陣

考慮到矩陣乘法的維數限制$[n,m]*[m,p]$,通常構造成$n*n$的矩陣。

構造方法就是按矩陣乘法的特性,先構造出冪矩陣第一列,然後yy出剩餘列。

本題構造如下:

$\beginf2 & f1  & 1\\ 0 & 0 & 0\\ 0 & 0 & 0\end\begin1 &  1&0 \\ 2 &  0&0 \\ 1& 0 &1 \end=\beginf3 &  f2&1 \\

0 &  0&0 \\ 0& 0 &0\end$

特判n=1、n=2,從n=3開始,冪(n-2)次,乘以基礎f2、f1的矩陣。

#include "

cstdio

"#include

"cstring

"#define ll long long

#define mod 200907

#define k 3

struct

matrix

matrix(ll *val)

};matrix

operator *(matrix a,matrix b)

return

ret;

}matrix

operator ^ (matrix a,int

n)

return

ret;

}int

main()

; ll pval=;

matrix base(bval),pow(pval),ans=pow^(n-2

); ans=base*ans;

printf(

"%i64d\n

",ans.mat[0][0]%mod);}}

}

HDU 2842 遞推 矩陣快速冪

題目大意 棒子上套環。第i個環能拿下的條件是 第i 1個環在棒子上,前i 2個環不在棒子上。每個環可以取下或放上,cost 1。求最小cost。mod 200907。解題思路 題目意思非常無聊,感覺是yy的。設 dp i 為取第i個環時的總cost。dp 1 1 dp 2 2 前兩個環取下是沒有條件...

hdu 2842 矩陣高速冪 遞推

題意 乙個中國環的遊戲,規則是乙個木棒上有n個環。第乙個環是能夠任意放上或拆下的,剩下的環x假設想放上或拆下必須前乙個環x 1是放上的且前x 2個環所有是拆下的,問n個環最少多少次操作能夠所有拆掉。題解 須要進行遞推,首先第一步肯定是要拆第n個環保證操作次數最少,由於後面的環是否存在對前面的環不造成...

hdu 3519 遞推 矩陣快速冪

題目 題意 有n個硬幣排成一排,有正有反,問有2個以上連續的相同硬幣有幾種方案 分析 典型的推公式用矩陣快速冪求解的題目。偷個懶,貼個別人的推導 長度為 n 的 01 串一共有 2 n 種不同的排列方法 設 f n 為長度是 n 的不包含連續 3 個或以上相同的 1 或 0 的 01 串 則 f 1...