题意:忘了,反正就是打表
题解:打表(前缀和)
代码:
#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; }