Codeforces Round #463 (Div. 1 + Div. 2, combined) B. Recursive Queries ---- 二分+预处理

版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/82791252

题目传送门

做法:

  • 先根据题意,把[1,1e6]以内的所有数转换成题意中要求的(即预处理)。
  • 为了离线效率查询区间符合要求的个数,我们可以依据g(n)相同来分类,存到一个vector,然后我们就二分查当前k的那一个vector即可

AC代码:

#include<bits/stdc++.h>
#define IO          ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pb(x)       push_back(x)
#define sz(x)       (int)(x).size()
#define sc(x)       scanf("%d",&x)
#define pr(x)       printf("%d\n",x)
#define abs(x)      ((x)<0 ? -(x) : x)
#define all(x)      x.begin(),x.end()
#define mk(x,y)     make_pair(x,y)
#define debug       printf("!!!!!!\n")
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxm = 1e8+5;
const int maxn = 1e6+5;
const int INF = 0x3f3f3f3f;
inline int read()
{
    char x;
    int u,flag = 0;
    while(x = getchar(),x<'0' || x>'9') if(x == '-') flag = 1;
    u = x-'0';
    while(x = getchar(),x>='0' && x<='9') u = (u<<3)+(u<<1)+x-'0';
    if(flag) u = -u;
    return u;
}
bool check(int x){
    int cnt = 0;
    while(x){
        x/=10;
        cnt++;
    }
    return cnt == 1;
}
int change(int x)
{
    int res = 1;
    while(x){
        if(x%10 !=0){
            res = res*(x%10);
        }
        x/=10;
    }
    return res;
}
int dfs(int x)
{
    if(check(x)) return x;
    else dfs(change(x));
}
int Hash[maxn];
vector<int> vec[10];
int main()
{
    #ifdef LOCAL_FILE
    freopen("in.txt","r",stdin);
    #endif // LOCAL_FILE
    for(int i=1;i<=maxn;i++) //归类
    {
        Hash[i] = dfs(i);
        vec[Hash[i]].pb(i);
    }
    int q = read();
    while(q--)
    {
        int l,r,k;
        l = read();
        r = read();
        k = read();
        int pos1 = lower_bound(vec[k].begin(),vec[k].end(),r+1)-vec[k].begin();
        int pos2 = lower_bound(vec[k].begin(),vec[k].end(),l)-vec[k].begin();
        printf("%d\n",pos1-pos2);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37624640/article/details/82791252