题意:一个数,如果能写成某个数各位数的乘积,那么它就是XX数,XX数从1开始算起,然后问你第n个XX数是多少。

题解:考虑某个数的各位乘积得到的x,即所有1~10的数相乘,那么x分解质因数后必定由2、3、5、7组成,所以,所谓第几个XX数就是找第几个只有2,3,5,7的幂次构成的数而已,先打表预处理,直接得答案完事。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long LL;
 6 LL ans[100000];
 7 LL MAXN=1000000000000000000LL;
 8 int main()
 9 {
10     int p2,p3,p5,p7,top=2;
11     LL s2,s3,s5,s7;
12     ans[p2=p3=p5=p7=1]=1;
13     s2=2,s3=3,s5=5,s7=7;
14     while(ans[top-1]<=MAXN)
15     {
16         if(s2<s3&&s2<s5&&s2<s7)
17         {
18             if(s2>ans[top-1])
19                 ans[top++]=s2;
20             s2=ans[p2++]*2;
21         }
22         else if(s3<s5&&s3<s7)
23         {
24             if(s3>ans[top-1])
25                 ans[top++]=s3;
26             s3=ans[p3++]*3;
27         }
28         else if(s5<s7)
29         {
30             if(s5>ans[top-1])
31                 ans[top++]=s5;
32             s5=ans[p5++]*5;
33         }
34         else
35         {
36             if(s7>ans[top-1])
37                 ans[top++]=s7;
38             s7=ans[p7++]*7;
39         }
40     }
41     int T;
42     for(scanf("%d",&T);T;T--)
43     {
44         int n;
45         scanf("%d",&n);
46         printf("%lld\n",ans[n]);
47     }
48     return 0;
49 }