CodeForces - 628B【C - New Skateboard】(子串问题+被4整除)

#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

猜你喜欢

转载自blog.csdn.net/qq_41658955/article/details/87698999