1. 程式人生 > >[BZOJ 3612][Heoi2014]平衡

[BZOJ 3612][Heoi2014]平衡

計數dp ide .com image spa pri blank ons pan

傳送門

計數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

技術分享圖片

[BZOJ 3612][Heoi2014]平衡