有 n(2≤n≤100000) 个排成一行的整数,从位置 1 到位置 n,每个都在 −100 到 100 之间,如果某段(个数 ≥1)的数字和是 11 的整数倍,则称为一段 H 型段。请统计所有 H 型段的个数。
输入用 a 数组,a 数组前缀和一遍,另定义一个 b 数组。b0 先定义为 1, O(n) 循环扫一遍,ans+=bai,另外 bai++。
ans 开了 long long,ai 前缀和后做了绝对值。
#include <bits/stdc++.h>
using namespace std;
int n,a[100003],b[50];
long long ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) a[i]=a[i-1]+a[i],a[i]=a[i]%11;
for(int i=1;i<=n;i++) a[i]=abs(a[i]);
b[0]=1;
for(int i=1;i<=n;i++) ans+=b[a[i]],b[a[i]]++;
cout<<ans<<endl;
return 0;
}