题目大意:
给出一数列,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; }