题意:忘了,反正就是打表
题解:打表(前缀和)

代码:

#include<cstdio>
#include<set> 
using namespace std;


int num[1000000+5];
int num2[1000000+5][10];
//int sum[1000000+5][10];
int k;
//set<int>s;
int cnt;

int g(int x){
	while(x>=10){
		x = num[x];
	}
	return x;
}

int main(){ 
	int q;
	int l,r;
	for(int i = 1; i <= 1e6; i++){
		num[i] = 1;
		int x = i;
		while(x){
			int s = x%10;
			x/=10;
			if(s!=0){
				num[i]*=s;
			}
		}
	//	printf("%d ", num[i]);
	}
	
	for(int i = 1; i <= 9; i++) num2[i][0] = 0;
	
	for(int i = 1; i <= 1000000;i++){
			for(int j = 1; j <= 9;j++){
				if(g(i) == j){
					num2[i][j] = num2[i-1][j]+1;
				}else{
					num2[i][j] = num2[i-1][j];
				}
			}
	}
	scanf("%d",&q);

	while(q--){
		scanf("%d%d%d", &l,&r,&k);
		if(g(l) == k)
		cnt = num2[r][k] - num2[l][k]+1;
		else 
		cnt = num2[r][k] - num2[l][k];
		printf("%d\n", cnt);
	}
	return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注