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

题目地址: 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;

}
}


 

posted @ 2013-09-04 11:10  814jingqi  阅读(161)  评论(0编辑  收藏  举报