优美子数列2 Problem ID: 8628,WA20怎么办

题目描述:

数学家小 Q 得到了一个长度为 n 的数列 {an}。

小 Q 的幸运数字是 k,所以他认为,若一个子数列 al, al+1, …, ar 的和为 k 的倍数,则该子数列是优美子数列。

小 Q 现在想考考你,{an} 里有多少个优美子数列呢?

输入格式:

第一行输入两个正整数 n,k。

接下来一行输入 n 个数,代表 a1 到 an。

输出格式:

输出一行一个正整数,表示优美子数列的个数。

样例输入:

5 3
1 2 3 4 5

样例输出:

7

数据规模:

对于 60% 的数据,n≤1000;

对于 100% 的数据,1≤n≤2×105,1≤k≤107,-109≤ai≤109。
代码如下

#include<bits/stdc++.h>
using namespace std;
long long k,n,ans,a;
long long b[200005];
map<int,int>c;
int main()
{
    cin>>n>>k;c[0]=1;
    for(int i=1;i<=n;i++){	
        scanf("%lld",&a);
        b[i]=(b[i-1]+a%k)%k;
        ans+=c[b[i]]++;
    }printf("%lld",ans);return 0;
}
1 个赞

用map存

2 个赞

谢谢,但是它变成wa20了QAQ

1 个赞

b[i]=(b[i-1]+a%k)%k;
改成
b[i]=((b[i-1]+a%k)+k)%k;

2 个赞

为什么要加个k?

1 个赞

因为负数%正数=负数

2 个赞

谢谢,AC了

1 个赞