ABC 367D
作者:
Air1222
,
2024-09-26 16:14:28
,
所有人可见
,
阅读 3
//当整体(组合数)不好求时,可以考虑贡献法
//因为题目要求最小,即不能超过n,因此动态维护长度为n的区间,求出的值必然为最小值
//每个值表示一段跨越,因此s[i+1]-s[i],并不表示同一个点,而是从i到i+1,满足题意
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
typedef long long LL;
const int N = 4e5+10;
int a[N];
LL s[N];
int n,m;
map<int,LL>cnt;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i+n]=a[i];
}
for(int i=1;i<=2*n-1;i++)
s[i]=s[i-1]+a[i];
for(int i=1;i<=n;i++)
{
int x=s[i]%m;
cnt[x]++;
}
LL ans=0;
for(int i=1;i<=n;i++)
{
ans+=cnt[s[i]%m]-1;
cnt[s[i]%m]--;
cnt[s[i+n]%m]++;
}
cout<<ans;
return 0;
}