nowcoder11166F Find 3-friendly Integers(2021牛客暑期多校训练营1)抽屉原理
题意
L到R中有多少个数字满足他们有一个字串和为3的倍数(字串可以有前导0),\(1\le L\le R\le{10}^{18}\)
分析
很容易想到数位dp,但是仔细分析,还有更简单的做法。
通过查看某个串的前缀和,如果有同余\(0\)的,那么答案就是这个前缀。再由鸽巢原理可得长度\(\ge3\)的一定有两个位置同余\(1\)或者同余\(2\),则对于数字\(x\ge100\)一定满足条件。剩下的\(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<<'\n';
}
return 0;
}