统计区间[l,r],能被3整除的数字的数量。
Input:
已知数组中,每三个数字,第一个不能被3整除,后面两个都可以被3整除;例如:
数组编号 | 能否被整除 |
---|---|
1 | 0 |
2 | 1 |
3 | 1 |
4 | 0 |
5 | 1 |
6 | 1 |
7 | 0 |
8 | 1 |
9 | 1 |
… | … |
统计数组下标从l到r的范围内,问能被3整除的数字的个数?
其中, 0<=l<=r<=1e9;
分析
可以看出来,每隔3个数字,有2个数字可以被整除;所以中间部分可以直接写出来值来,
即 tot += 中间区间个数(每个区间3个数字)*2;
一头一尾的区间,注意,不要总结规律啦!浪费时间!直接遍历! 最多也就6个数字的遍历,很快的!
另外,特殊情况,l和r在一个区间内,直接遍历就行~
代码:
#include<cstdio>
int fun(int l, int r){
int ret = 0;
int div1 , div2;
div1 = (l-1)/3;
div2 = (r-1)/3;
//l和r在一个区间内
if(div1==div2){
for(int i=l; i<=r; i++)
if(i%3!=1)
ret++;
return ret;
}
//第一部分
for(int i=l; i<=div1*3+3; i++)
if(i%3 != 1)
ret++;
//最后一部分
for(int i=div2*3+1; i<=r; i++)
if(i%3 != 1)
ret++;
//中间部分
ret += (div2 - div1 -1)*2;
return ret;
}
int main(){
int l,r;
while(~scanf("%d%d",&l,&r)){
int tot = fun(l,r);
printf("%d\n",tot);
}
return 0;
}