Vijos 1090 连续数之和(鸽巢定理+组合数)

题目链接

matrix67大神出的题,做出来好激动啊。。。和前几天做的那个用鸽巢定理差不多,只不过是加上一个组合而已。开始把50000的组合数都给预处理出来了,果断TLE了,改了改处理到n,然后0ms秒过了。。。

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 #define MOD 1234567
 5 int c[500001][3],p[500001],sum[500001],o[100001];
 6 int main()
 7 {
 8     int i,j,n,m,ans;
 9     scanf("%d%d",&n,&m);
10     for(i = 0;i <= n;i ++)
11     c[i][0] = 1;
12     for(i = 1;i <= n;i ++)
13     {
14         for(j = 1;j <= 2;j ++)
15         c[i][j] = (c[i-1][j-1]+c[i-1][j])%MOD;
16     }
17     for(i = 1;i <= n;i ++)
18     {
19         scanf("%d",&p[i]);
20         sum[i] = (sum[i-1] + p[i])%m;
21         o[sum[i]]++;
22     }
23     for(i = 0,ans = 0;i <= m-1;i ++)
24     {
25         ans = (ans + c[o[i]][2])%MOD;
26     }
27     ans = (ans + o[0])%MOD;
28     printf("%d\n",ans);
29     return 0;
30 }
posted @ 2012-10-11 10:46  Naix_x  阅读(297)  评论(0编辑  收藏  举报