#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
long long ans = 0;
for (int i = 0; i < s.size(); i++)
if ( (s[i] - '0') % 4 == 0 )
ans++;
for (int i = 1; i < s.size(); i++)
if (( s[i] - '0' + (s[i - 1] - '0') * 2 ) % 4 == 0)
ans += i;
printf("%lld\n",ans);
}
题意简单,连接:https://vjudge.net/contest/280510#problem/C
题目大意是求所求字符串的子串中被4整除的子串数目。
【解题思路】被4整除,程序分为两个方向考虑:
(1)单个字符被4整除(遍历一次即可)O(n)复杂度
(2)两个或两个以上字符被4整除:
1.结论:(2*x+y)%4==0可以推出(10*x+y)%4==0
证明:5*(2*x+y)==(10*x+5*y)%4==0
因此,(10*x+y)==(10*x+5*y)-4*y
所以:(10*x+y)%4==0结论得证
2.上述结论可以很快的判断10*x+y能不能被4整除
三位及三位以上的数字能不能被4整除等价于其取余100后能否被4整除(原因是100及其倍数能被4整除)
3.对于s[0]~s[i]的i+1个字符的情况:如果后两位s[i-1]和s[i]无法满足被4整除的条件
那么这i+1个字符的子串被4整除数量为0
如果后两位数字满足条件:那么子串可以这样计算:
s[i-1]+s[i]这两个字符首先包括在内。数量+1
s[0]~s[i-2]这i-1个字符从左向右连续选择到1个字符,2个字符...i-1个字符。数量+i-1
合并起来,子串数量+i