洛谷P2822 组合数问题

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 }
点我>_<

骗分真神奇,暴力出奇迹。

posted @ 2017-03-19 17:14  lonlyn  阅读(124)  评论(0编辑  收藏  举报