一.题目描述
二.问题分析
对于该问题,标签上写的是暴力,但是如果使用暴力的话,会超时。
首先,对于两个数a,b(假设a小于b),若a与b对k取余后结果相同,则b-a可以整除k。
由此,我们可以利用上述结论:对于第i个数,我们只需要知道下标在1~i-1范围内有多少个和下标为1~i范围内数之和同余数的区间,该值等于新加入了第i个数之后k倍区间增加的数目。
//k倍区间
#include <iostream>
using namespace std;const int N=1e5+2;
int n,k;
long long cnt=0;
long long a[N]={0},c[N]={0};int main(int argc, const char * argv[]) {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>k;c[0]=1;for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];cnt+=c[a[i]%k];c[a[i]%k]++;}cout<<cnt<<'\n';return 0;
}