题目链接:传送门
题意:如果一个数的子集能被3整除, 这个数就叫3友好数, 求[l, r]区间里的3友好数有多少。
思路:不难发现到三位数后全是满足条件的数,所以仅需考虑100以内的数即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define mem(a, b) memset(a, b, sizeof a)
const int N = 1e2 + 5;
int t, l, r;
int sum[N];
void init(){
for(int i = 1; i < 100; i ++){
if(i < 10) sum[i] = sum[i - 1] + !(i % 3);
else sum[i] += sum[i - 1] + (i % 3 == 0 || i % 10 % 3 == 0 || i / 10 % 3 == 0);
}
}
signed main(){
init();
cin >> t;
while(t --){
cin >> l >> r;
if(l >= 100) cout << r - l + 1 << endl;
else if(r >= 100) cout << r - 100 + 1 + sum[99] - sum[l - 1] << endl;
else cout << sum[r] - sum[l - 1] << endl;
}
}