笔试刷题-网易

题目描述:

/**
小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。

并且小Q对于能否被3整除这个性质很感兴趣。

小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。


输入描述:
输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。


输出描述:
输出一个整数, 表示区间内能被3整除的数字个数。

输入例子1:
2 5

输出例子1:
3

例子说明1:
12, 123, 1234, 12345...
其中12, 123, 12345能被3整除。
*/

思路如下:

/**
1,2,3,4,5,...,9,10,11,12,...,1000
上述组成的数字其是否被3整除其实跟
1+2+3+4...+10+11...+1000是膜3同余
以10这个数字拼的来看
123 __ __ __ __还有10^tail次方
可以看车个(10^tail-1)*123+123 tail>=0
若依仅仅这么看10^tail-1肯定膜3余为0
问题已经转化成累计和mod3的问题了

1到l-1累积和 mod3的余数作为开始
设l-r共N个数

0: 1 2 0循环
1到l-1累积和为0
那么从l开始产生的累积和mod3数列如下
0+1(这个0是1到l-1累积mod3为0, 1是l%3), (1+2)%3=0(1是1到l+1累积和mod3 2是l+2mod3),
那么mod循环序列为 1 0 0 1 0 0如此计算0的个数即可

其他两个情形类似,注意尾巴的处理,具体见代码
1: 2 0 1 循环
2: 0 1 2 循环

*/

代码如下:

#include<stdio.h>
#include<iostream>

typedef long long LL;

using namespace std;

int main(){
    LL l, r, lastMod=0, res=0, N;
    scanf("%lld%lld", &l, &r);
    N=r-l+1;
    lastMod=(l-1)*l/2;
    lastMod%=3;
    if(lastMod==0){
        res=2*(N/3);
        if(N%3==2)
            res+=1;
    }
    else if(lastMod==1){
        res=2*(N/3);
        if(N%3==1)
            res+=1;
        else if(N%3==2)
            res+=2;
    }
    else if(lastMod==2){
        res=N/3;
        if(N%2==2)
            res+=1;
    }
    printf("%lld", res);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值