K.number
题意:
给出一个字符串,判断能整除的字符串个数
600 输出4 600 0 0 00
题解:
根据前缀和对3取余,答案加上00前面的前缀和对3取余的个数
578162000 00 前面的2%3 == 2 , 2出现了3次 (表示前一个2到这一个2之间有两个3的倍数)
上面的数前缀和对3取余 2 0 2 0 0 2 2 2 2
看出162 % 3 == 0 78162 % 3 == 0
#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 a[5]={0,0,0,0,0}, len = s.size(), x = 0;
a[0] = 1;
for(int i = 0; i < len; i++){
if(s[i] == '0'){ // 0单独加
ans++;
}
if(s[i] == '0' && s[i+1] == '0'){ // 如果出现00,那么加上它前缀和%3的个数的和
ans = ans + a[x];
}
x = (x + s[i] - '0') % 3; // 前缀和对3取余
a[x]++;
}
cout << ans << endl;
return 0;
}