原题跳转
思路:
打印前1000项,找规律。
发现100项以后全为YES。
把前100项提前打表预处理,然后区间在100项的区间部分扫描计数。
对于100项以后的区间部分有sum = r - l + 1,
打印前1000代码
using namespace std;
void toString(string &s, int &num){
stringstream ss;
ss << num;
ss >> s;
}
void toInt(string &s, int &num){
stringstream ss;
ss << s;
ss >> num;
}
int main(){
// 枚举前1000项
for (int i = 1; i <= 1000; ++i) {
bool flag = false;
string s;
toString(s, i);
if(s.find('0')!=-1){
flag = true;
}
// 位数
int len = s.length();
// 枚举位数
int num;
for (int l = 1; l <= len; ++l) {
for (int ind = 0; ind <= len-l; ++ind) {
string sss = s.substr(ind, l);
toInt(sss, num);
if(num%3==0){
flag = true;
break;
}
}
if(flag){
break;
}
}
if(flag){
printf("YES\t");
}else{
printf("NO\t");
}
if(i%10==0){
printf("\n");
}
}
return 0;
}
打印结果:
AC代码
using namespace std;
int a[100] = {0,0,1,0,0,1,0,0,1,1,
0,1,1,0,1,1,0,1,1,1,
1,0,1,1,0,1,1,0,1,1,
1,1,1,1,1,1,1,1,1,1,
0,1,1,0,1,1,0,1,1,1,
1,0,1,1,0,1,1,0,1,1,
1,1,1,1,1,1,1,1,1,1,
0,1,1,0,1,1,0,1,1,1,
1,0,1,1,0,1,1,0,1,1,
1,1,1,1,1,1,1,1,1,1};
int main(){
int t;
scanf("%d", &t);
long long l, r, sum;
while (t--){
sum = 0;
scanf("%lld%lld",&l,&r);
if(l > 100){
printf("%lld\n", (r - l + 1));
}else if(r > 100){
// 索引从0开始
for (int i = l - 1; i <= 99; ++i) {
if(a[i]){
sum++;
}
}
printf("%lld\n", (r - 100 + sum));
}else{
for (int i = l - 1; i < r; ++i) {
if(a[i]){
sum++;
}
}
printf("%lld\n", sum);
}
}
return 0;
}