Vijos P1090连续数之和

维护前缀和

假设有一段前缀和i~j

sum[j]-sum[i-1] mod k=0

显然

sum[i-1] mod k=sum[j] mod k

这样在读入的时候我们可以统计mod k余数为r的个数。

在余数相同的数中,任意两个匹配都可以。ans+=n*(n-1)/2 n为余数为r的数的个数。

注意特殊情况!

#include
#define MOD 1234567
int f[100000];
int main()
{
    int x,n,k;
    long long ans=0,sum=0; 
    scanf("%d %d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        sum+=x;
        f[sum%k]++;
    }
    ans=f[0];
    for(int i=0;i<=k;i++)
        ans=(ans+(f[i]*(f[i]-1))/2)%MOD;
    printf("%d",ans);
    while(1);
    return 0;
}


你可能感兴趣的:(数论)