2017-03-19
题目:https://www.luogu.org/problem/show?pid=2822
组合数有一个式子:C(m,n)=C(m,n-1)+C(m-1,n-1);
当然,如果用比较暴力的方法A不了。。。。。。
用一个前缀和优化就好了。。。。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #define LL long long 5 using namespace std; 6 7 int t,k,n,m; 8 LL ans[2010][2010]; 9 LL ansn[2010][2010]; 10 11 int main(){ 12 scanf("%d%d",&t,&k); 13 for (int i=0;i<=2000;++i) ans[i][0]=1; 14 for (int i=1;i<=2000;++i){ 15 for (int j=1;j<=i;++j){ 16 ans[i][j]=((ans[i-1][j]%k)+(ans[i-1][j-1])%k)%k; 17 } 18 } 19 for (int i=1;i<=2000;++i){ 20 for (int j=1;j<=2000&&j<=i;++j){ 21 ansn[i][j]=ansn[i-1][j]+ansn[i][j-1]-ansn[i-1][j-1]; 22 if (ans[i][j]==0) ++ansn[i][j]; 23 } 24 for (int j=i+1;j<=2000;++j) ansn[i][j]=ansn[i][j-1]; 25 } 26 27 while (t--){ 28 scanf("%d%d",&n,&m); 29 cout<<ansn[n][m]<<endl; 30 } 31 return 0; 32 }
骗分真神奇,暴力出奇迹。