题意:有n个休息取,休息区按顺时针顺序编号为1,2,。。N从休息区i顺时针到i+1需要ai步,从休息区s顺时针到休息区t的最小步数是m的倍数,求(s,t)的可能对数
分析:前缀和为p,pt-ps为m的倍数,ps%m==pt%m,统计pi%m的个数即可,s到t之间不超过n个休息区
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int main(){cin>>n>>m;ll a[n+10],cnt[m+10];memset(cnt,0,sizeof(cnt));ll sum=0,ans=0;for(int i=1;i<=n;i++){cin>>a[i];ans+=cnt[sum%m];cnt[sum%m]++;sum+=a[i];}ll s=sum;sum=0;for(int i=1;i<=n;i++){cnt[sum%m]--;ans+=cnt[s%m];s+=a[i];sum+=a[i];}cout<<ans<<endl;
}