300iq loves numbers who are multiple of 300.
One day he got a string consisted of numbers. He wants to know how many substrings in the string are multiples of 300 when considered as decimal integers.
Note that leading and trailing zeros are allowed (both in original string and substrings you chose) and the same substring appearing in different places can be counted multiple times.
输入
123000321013200987000789
输出
55
题意:求300的倍数的子串个数
题解:求出字符串的前缀和余 3 取模
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
int main(){
string s;
cin >> s;
ll ans = 0; // 超出int
int a[5]={0,0,0,0}, k = s.size(), c = 0; // 数组初始化
a[0] = 1;
for(int i = 0; i < k; i++){
if(s[i] == '0'){
ans++;
}
if(s[i]=='0' && s[i+1] == '0'){
ans = ans + a[c];
}
c = (c + s[i]-'0') % 3;
a[c]++;
}
cout << ans << endl;
return 0;
}