[BZOJ 3612][Heoi2014]平衡

传送门

计数dp的第一题

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define rep(i,a,b) for(int i=a;i<=b;++i)
 4 const int maxn=100100;
 5 int f[maxn][15],n,K,P,T;
 6 inline int gi() {
 7     int x=0; char o; bool f=true; for(;!isdigit(o=getchar());)if(o=='-')f=true;
 8     for(;isdigit(o);o=getchar()) x=(x<<1)+(x<<3)+(o&15); return f?x:~x+1;
 9 }
10 int main() {
11     T=gi();
12     while(T--) {
13         n=gi(); K=gi(); P=gi(); int w=n*(K-1);
14         if(K==1) {puts("1"); continue;}
15         memset(f,0,sizeof(f)); f[0][0]=1;
16         rep(i,1,w) rep(k,1,K) {
17             if(i>=k) f[i][k]=(f[i-k][k]+f[i-k][k-1])%P;
18             if(i>=n+1) f[i][k]=(f[i][k]-f[i-n-1][k-1]+P)%P;
19         }
20         int ans=0;
21         rep(i,1,w) rep(k,1,K-1) 
22             ans=(ans+1LL*f[i][k]*f[i][K-k]%P)%P;
23         rep(i,1,w) rep(k,1,K-2)
24             ans=(ans+1LL*f[i][k]*f[i][K-k-1]%P)%P;
25         printf("%d\n",ans);
26     }
27     return 0;
28 }
View Code

猜你喜欢

转载自www.cnblogs.com/miecoku/p/9762662.html