题意
L到R中有多少个数字满足他们有一个字串和为3的倍数(字串可以有前导0),(1le Lle Rle{10}^{18})
分析
很容易想到数位dp,但是仔细分析,还有更简单的做法。
通过查看某个串的前缀和,如果有同余(0)的,那么答案就是这个前缀。再由鸽巢原理可得长度(ge3)的一定有两个位置同余(1)或者同余(2),则对于数字(xge100)一定满足条件。剩下的(99)个数只需暴力判断即可。
代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
ll l,r;
cin>>T;
while(T--) {
cin>>l>>r;
ll m=min(99ll,r);
ll ans=min(r-l+1,r-m);
for(ll i=l;i<=m;i++)
if(i%3==0 || i>=10 && (i/10%3==0 || i%10%3==0)) ans++;
cout<<ans<<'
';
}
return 0;
}