The Super Powers UVA - 11752
考察:枚举+质数筛
错误思路:
通过观察很容易发现指数必须是合数,筛出质数,用质数为底数快速幂求幂后的结果insert进set
这个思路有几个错误点:
- 合数也可以是底数 如68 这个用质数快速幂是求不出来的(思路不完全...)
- 不能用快速幂求结果,这样不能判断是否溢出
正确思路:
一个一个乘,当发现再乘会溢出时就break....
回顾知识:
- int的最大范围是231 -1. long long 是263 -1 . unsigned long long 是264 -1 .
- 求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 }