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 }