CF932B Recursive Queries 题解
Problem
Solution
注意到如果 \(Q\) 次询问每次都去算一遍会超时。
发现 \(l\) 和 \(r\) 很小,考虑预处理,同时注意到 \(k\) 最大不会超过 \(9\),所以定义 \(c_{i,j}\) 为 \(1\) 到 \(i\) 中 \(g_i\) 为 \(k\) 的个数,预处理所有的 \(c\) 即可。
明显不会超时。
Code
#include<bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define FOR(i,a,b) for(int i=(a);i>=(b);i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const int N=1e6;
int l,r,k,f[N+4],g[N+4],c[N+4][11];
int pow(int x,int y)
{
int s=x;
For(i,2,y)s*=x;
return s;
}
void solve()
{
cin>>l>>r>>k;
cout<<c[r][k]-c[l-1][k]<<"\n";
}
void init()
{
f[0]=g[0]=1;
For(i,1,9)f[i]=g[i]=i;
For(w,2,6)
For(i,pow(10,w-1),pow(10,w)-1)
{
f[i]=f[i%pow(10,w-1)]*(i/pow(10,w-1));
g[i]=g[f[i]];
}
f[N]=f[N%pow(10,5)]*(N/pow(10,5));
g[N]=g[f[N]];
For(k,1,9)
For(i,1,N)
if(g[i]==k)c[i][k]=c[i-1][k]+1;
else c[i][k]=c[i-1][k];
}
int main()
{
IOS;
init();
// For(i,1,20)cout<<f[i]<<" ";cout<<"\n";For(i,1,20)cout<<g[i]<<" ";cout<<"\n";
int Q;cin>>Q;
while(Q--)solve();
return 0;
}

浙公网安备 33010602011771号