被3整除
题目描述
小Q得到一个神奇的数列: 1, 12, 123,…12345678910,1234567891011…。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。
输入描述:
输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。
输出描述:
输出一个整数, 表示区间内能被3整除的数字个数。
示例1
输入 2 5
输出 3
说明
12, 123, 1234, 12345…
其中12, 123, 12345能被3整除。
解题思路:
这道题由于数据量很大不能直接计算各个位的加和再与3整除。需要找规律。
r=1~9内比较好判断:
根据公式(1+n)*n/2可以算出各个位的加和。
例如:123 1+2+3=6 6%3=0 故可被三整除
r>10时,似乎不能再用上面的公式,需要再进行找规律:
例如 123456789101112
其中1+2+3+…+9+1+2+3=(45+1+2+3)%3=51%3=0,而1+2+3+…+12=(45+10+11+12)=78%3=0
似乎存在着对应的关系。
试了几个例子后发现,
如果是大于等于两位数,它算成 一个数 和 把每一位分开 计算对3取余的结果都是一样的。
#include <iostream>
using namespace std;
int main()
{
long long l,r;
while(cin>>l>>r)
{
long long sum=0;
for(long long i=l;i<=r;i++)
{
if((i+1)*i/2%3==0)
{
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}