Loading

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;
}
posted @ 2021-07-21 11:38  intmian  阅读(64)  评论(0编辑  收藏  举报