​原题跳转​

思路:
打印前1000项,找规律。
发现100项以后全为YES。
把前100项提前打表预处理,然后区间在100项的区间部分扫描计数。
对于100项以后的区间部分有sum = r - l + 1,

​打印前1000代码​

#include <iostream>
#include <sstream>
#include <string>
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;
}

​打印结果:​​​2021牛客暑期多校训练营1-F(Find 3-friendly Integers)_#include
​AC代码​

#include <iostream>
#include <sstream>
#include <string>
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;
}