The Super Powers UVA - 11752

原题链接

考察:枚举+质数筛

错误思路:

       通过观察很容易发现指数必须是合数,筛出质数,用质数为底数快速幂求幂后的结果insert进set

这个思路有几个错误点:

  1. 合数也可以是底数 如68 这个用质数快速幂是求不出来的(思路不完全...)
  2. 不能用快速幂求结果,这样不能判断是否溢出

正确思路:

       一个一个乘,当发现再乘会溢出时就break....

回顾知识:

  1. int的最大范围是231 -1. long long 是263 -1 . unsigned long long 是264 -1 .
  2. 求INF相乘时不会溢出,但存储到变量内部会取模
 1 #include <iostream>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <set>
 5 using namespace std;
 6 typedef long long ll;
 7 typedef unsigned long long ull;
 8 const int N = 100;
 9 int prime[N],cnt;
10 bool st[N];
11 ull INF = (1<<64)-1;
12 set<ull> s;
13 ull qsm(ull n,ull k)
14 {
15     ull res = 1;
16     while(k)
17     {
18         if(k&1) res = res*n;
19         k>>=1;
20         n = n*n;
21     }
22     return res;
23 }
24 void GetPrime(int n)
25 {
26     for(int i=2;i<=n;i++)
27     {
28         if(!st[i]) prime[++cnt] = i;
29         for(int j=1;prime[j]<=n/i;j++)
30         {
31             st[i*prime[j]] = 1;
32             if(i%prime[j]==0) break;
33         }
34     }
35 }
36 int main()
37 {
38     GetPrime(N-10);
39     s.insert(1);
40     for(int i=2;i<=(1<<16);i++)
41     {
42         ull ans = 1;
43         for(int j=1;j<64;j++)
44         {
45             ans*=i;
46             if(st[j]) s.insert(ans);
47             if(ans>INF/i) break;
48         }
49     }
50     for(auto it:s) printf("%llu\n",it);
51     return 0;
52 } 

 

posted @ 2021-01-28 20:00  acmloser  阅读(77)  评论(0编辑  收藏  举报