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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值