514E 矩陣快速冪 DP

2021-06-29 09:06:18 字數 1052 閱讀 6037

一棵樹,每個結點有n個兒子,該第i個兒子到父節點的距離為d[i],問離根節點距離不超過x的結點有多少個,結果對1e9+7取模。

首先注意到每個di <= 100資料很小, 如果用ti表示所有n中分支中長度為i的個數, 那麼就有t[1~100], 

* 用dp[i]表示到根節點長度為i的點的個數, 那麼不難發現狀態轉移方程

* dp[x] = dp[x - 1]*t[1] + dp[x - 2]*t[2] + ... + dp[x - 100]*t[100]

* 顯然對於這個線性的狀態轉移方程, 預先處理計算出dp[0~99]即可遞推後邊的值

* 最後的結果是s[x] = dp[0] + dp[1] + ... + dp[x]

* 所以可以建立矩陣轉移,

#includeusing namespace std;

#define ll __int64

#define maxn 102

#define mod 1000000007

struct matrix

return res;

}ll t[maxn],dp[100005];

int main()

memset(dp,0,sizeof(dp));

ll s=1;

dp[0]=1;

for(i=1;i<=100;++i)

ll ans=0;

if(x<=100)

for(i=0;i<=x;++i) ans=(ans+dp[i])%mod;

else

a.a[i][1]=0,a.a[i][101]=1;

for(i=1;i<=99;++i) a.a[i][i+1]=1;

a=pow(a,x-99);

for(i=1;i<=100;++i) ans=(ans+dp[100-i]*a.a[i][101])%mod;

ans=(ans+s*a.a[i][101])%mod;

}printf("%i64d\n",ans);

return 0;

}

dp 矩陣乘法快速冪

1 p1926 斐波那契 include include include using namespace std long long n const int mod 1000000007 long long nw 2 2 ans 2 2 long long t 2 2 void mul1 void ...

DP 矩陣快速冪 kmp GT考試

阿申準備報名參加 gt 考試,准考證號為 n 位數 x1x 2 xn x 1x 2 x n x1 x2 xn 他不希望准考證號上出現不吉利的數字。他的不吉利數字 a1a 2 am a 1a 2 a m a1 a2 am 有 m 位,不出現是指 x1x2 xn 中沒有恰好一段等於 a1a 2 am a...

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...