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

本文解析了一道由matrix67提出的编程题目,采用组合数学的方法并结合鸽巢原理进行求解。通过预处理组合数避免超时,并最终实现了0ms运行时间。

题目链接

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 }

转载于:https://www.cnblogs.com/naix-x/archive/2012/10/11/2719551.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值