Loading

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;
}
posted @ 2024-08-13 21:51  ๑҉v  阅读(10)  评论(0)    收藏  举报