首先可以枚举1到100000的每一个数字是否是美丽的数字,只需要将每一位数字提取出来之后判断是否能用过即可。再预处理出每一个前缀中有多少美丽的数字。比如可以用f[i]表示小于i的所有数字中有多少美丽数字。之后对于每组数据答案就是f[b]-f[a-1]。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int vis[10];
int f[100005];
int main(){
for(int i = 1; i <= 100000; i++){
memset(vis,0,sizeof(vis));
int tmp = i;
while(tmp){
if(vis[tmp%10]){
f[i] = f[i-1];
break;
}
vis[tmp%10] = 1;
tmp /= 10;
}
if(tmp == 0)
f[i] = f[i-1] + 1;
}
int T;
scanf("%d",&T);
while(T--){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",f[b]-f[a-1]);
}
return 0;
}