被3整除

题目描述

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

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

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

输入描述:

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

输出描述:

输出一个整数, 表示区间内能被3整除的数字个数。
示例1

输入

复制
2 5

输出

3
题解:

一个数所有位数的和相加如果等于3的倍数,则这个整数是3的倍数。
这里第一个数是1,第二个是12,第三个是123……第n个数是123……(n-1)n,
各个位之和可以算成(i+1)*i/2,类似于等差数列求和的公式
(之前没想到,看了一下别人的代码,百度验证了一下理论的正确性)
推导过程如下:(n位数是类似的推导过程)

注意并不是说一个数b是x的倍数,那么这个数b各个位相加就是x的倍数;
例如:12是2和4的倍数,1+2却不是2和4的1倍数

代码如下:

 

#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <cstdio>
#include <string>
#include <cstring>
/*@author:浅滩
*family:
*time:
*/
//我好像是一个在海边玩耍的孩子,
//不时为拾到比通常更光滑的石子或更美丽的贝壳而欢欣鼓舞,
//而展现在我面前的是完全未探明的真理之海
using namespace std;
typedef long long ll;
int main()
{
ll l,r;
ll cnt=0;
cin>>l>>r;
for(ll i=l;i<=r;i++)
{
    if((i*(i+1)/2)%3==0)
    cnt++;
}
cout<<cnt<<endl;

//cout << "Hello world!" << endl;
    return 0;
}

posted @ 2019-06-27 14:20  浅滩浅  阅读(481)  评论(0编辑  收藏  举报