bzoj4870
http://www.lydsy.com/JudgeOnline/problem.php?id=4870
矩陣快速冪。。。
人話題意:從nk個物品里選模k余r個物品,問方案數模P
那么我們有方程 f[i][j]=f[i-1][j]+f[i-1][j-1] 跟組合數一個樣子 j∈(0,k) 這個物品選還是不選加起來
構造矩陣:x.a[0][0]=1 0個里選0個的方案是1 g.a[i][i]=1 g.a[i][i+1]=1 自己手畫一下
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 60; struct mat {ll a[N][N]; } x, g; ll n, k, p, r; void build() {x.a[0][0] = 1; //0個物品選0個的方案數為1 for(int i = 0; i < k; ++i) {++g.a[i][i]; ++g.a[i][(i + 1) % k]; //矩陣的系數 f[i][j]=f[i-1][j]+f[i-1][j-1] 所以j=1,j-1=1 } } mat operator * (const mat &A, const mat &B) {mat ret; memset(ret.a, 0, sizeof(ret.a));for(int i = 0; i < k; ++i)for(int j = 0; j < k; ++j)for(int x = 0; x < k; ++x) ret.a[i][j] = (ret.a[i][j] + A.a[i][x] * B.a[x][j]) % p;return ret; } void power(mat A, ll t) {for(; t; A = A * A, t >>= 1) if(t & 1) x = x * A; } int main() {scanf("%lld%lld%lld%lld", &n, &p, &k, &r);build();power(g, n * k);printf("%lld\n", x.a[0][r]);return 0; } View Code?
轉載于:https://www.cnblogs.com/19992147orz/p/6777314.html
總結
- 上一篇: DB2下载地址总结
- 下一篇: 数字电影打包内容(Packaging)