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 }

你可能感兴趣的:(OS)