题目描述
小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
输入描述:
输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。
输出描述:
输出一个整数, 表示区间内能被3整除的数字个数。
示例1
输出
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; }