nowcoder11166F Find 3-friendly Integers(2021牛客暑期多校训练营1)抽屉原理

题意

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;
}
原文地址:https://www.cnblogs.com/intmian/p/15038801.html