POJ 3844 Divisible Subsequences

来源:互联网 发布:win10优化 gui 编辑:程序博客网 时间:2024/04/29 12:35
 

题目大意:

给出一数列,n<=50000,并给出一个除数d,求这样的连续子数列的个数,满足其和被d整除.

思路:

naive:O(n^2),pass;

key point:

if two partial sums have the same remainder, their difference is divisible by d.

即前i个数的和与前j个数的和被d除余数相同,则i+1...j构成一个解.

#include<iostream>#include<cstring>using namespace std;class DivisibleSubsequences{    int n,d,mod[1000000],ans;    public:    void work();};void DivisibleSubsequences::work(){    memset(mod,0,sizeof(mod));    ans=0;mod[0]=1;    int i,s=0;    cin>>d>>n;    while(n--)    {        cin>>i;        s=(s+i)%d;        ans+=mod[s]++;//此之前余数s已经出现了mod[s]次    }    cout<<ans<<endl;}DivisibleSubsequences D;int main(){    int cases;    for(cin>>cases;cases;cases--)    D.work();    return 0;}