链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2852
题解
真的是神奇题目
假设一个数分解质因数之后是
∏
p
i
q
i
\prod p_i^{q_i}
∏piqi
如果这个数能被表示成
k
k
k次幂,那么一定有
k
∣
g
c
d
(
q
1
,
q
2
,
q
3
.
.
.
)
k|gcd(q_1,q_2,q_3...)
k∣gcd(q1,q2,q3...)
那么只要
g
c
d
(
q
1
,
q
2
,
.
.
.
)
gcd(q_1,q_2,...)
gcd(q1,q2,...)不是质数,这个数就是题目所要求的数
我可以直接枚举
i
=
g
c
d
(
q
1
,
q
2
,
q
3
.
.
.
)
i=gcd(q_1,q_2,q_3...)
i=gcd(q1,q2,q3...),然后再枚举底数
j
i
j^i
ji
显然
i
<
64
i<64
i<64
用
s
e
t
set
set去一下重就好了
代码
//数学题
#include <bits/stdc++.h>
#define ll unsigned long long
#define lim 18446744073709551615ull
using namespace std;
bool isprime(ll x)
{
ll i;
for(i=2;i*i<=x;i++)if(x%i==0)return 0;
return 1;
}
ll fastpow(ll a, ll b)
{
ll ans=1, t=a;
for(;b;b>>=1,t*=t)if(b&1)ans*=t;
return ans;
}
int main()
{
ll i, j, k;
set<ll> s;
set<ll>::iterator it;
for(i=2;i<=64;i++)
if(!isprime(i))
{
k=pow(2.0,63.99999999999/i);
for(j=1;j<=k;j++)s.insert(fastpow(j,i));
}
for(it=s.begin();it!=s.end();it++)printf("%llu\n",*it);
return 0;
}