一棵樹,每個結點有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 會超時,這裡引入快速冪來...