1 条题解
-
0
整个序列复制一遍放在原本的后面(环的基本处理),用一个前缀和再对m取模,每次寻找一个长度为n的串,用莫队(或许不算)找有多少个和头与m同余的,即路径模m余0,ans记录总和即可。
#include<bits/stdc++.h> #define int long long using namespace std; const int N=1e6+10; int a[N],s[N]; signed main() { int n,m;scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++)scanf("%lld",&a[i+1]),a[i+1]%=m,a[i+n+1]=a[i+1]; for(int i=1;i<=n*2;i++)a[i]=(a[i-1]+a[i])%m; for(int i=1;i<=n;i++)s[a[i]]++; int ans=0; for(int i=n+1;i<=n*2;i++) { s[a[i-n]]--; s[a[i]]++; ans+=s[a[i-n+1]]-1; } printf("%lld\n",ans); return 0; }
- 1
信息
- ID
- 7986
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 8
- 标签
- 递交数
- 19
- 已通过
- 6
- 上传者