poj 3844 Divisible Subsequences 剩余类,组合计数

来源:互联网 发布:centos和ubuntu的命令 编辑:程序博客网 时间:2024/05/17 09:05

题目地址: http://poj.org/problem?id=3844


思路: a[i]+a[i+1]+...+a[j]=s[j]-s[i];  于是整除等价于 s[i]===s[j] (mod d);   然后统计出现了多少次 c[n][2]就可以了 。  值得注意的是,有可能50000* (50000-1)/2  要用long long

每次进入一个新case 后把p 清零,sum【i】表示前i个数的和,  0=<i<=n

代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;int sum[50005];int p[1000000];int main(){int T;cin>>T;int d;int n;while(T--){  cin>>d>>n;  int temp;  memset(p,0,sizeof(p));  for(int i=0;i<n;i++)  {    scanf("%d",&temp);    sum[i+1]=(sum[i]+temp)%d;    p[sum[i+1]]++;  }  p[0]++;  long long ans=0;  for(int i=0;i<d;i++)   {      long long temp=p[i];      if(temp>=2)      ans+=temp*(temp-1)/2;   }  cout<<ans<<endl;}}


 

原创粉丝点击