思路:
如果一个数被质因数分解后,产生的素数个数没有重复的,呢么答案就只有一个。
参考代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
int cnt,ct;
ll fac[maxn],num[maxn];
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
ll multi(ll a,ll b,ll m)
{
ll ans=0;
a%=m;
while(b)
{
if(b&1)
{
ans=(ans+a)%m;
}
b>>=1;
a=(a+a)%m;
}
return ans;
}
ll pow(ll a,ll b,ll m)
{
ll ans=1;
a%=m;
while(b)
{
if(b&1)
{
ans=multi(ans,a,m);
}
b>>=1;
a=multi(a,a,m);
}
return ans;
}
bool Miller_Rain(ll n)
{
if(n==2)
return true;
if(n<2||!(n&1))
return false;
ll m=n-1;
int k=0;
while((m&1)==0)
{
k++,m>>=1;
}
for(int i=0; i<10; i++)
{
ll a=rand()%(n-1)+1;
ll x=pow(a,m,n);
ll y=0;
for(int j=0; j<k; j++)
{
y=multi(x,x,n);
if(y==1&&x!=1&&x!=n-1)
return false;
x=y;
}
if(y!=1)
return false;
}
return true;
}
ll pollard_rho(ll n,ll c)
{
ll i=1,k=2;
ll x=rand()%(n-1)+1;
ll y=x;
while(true)
{
i++;
x=(multi(x,x,n)+c)%n;
ll d=gcd((y-x+n)%n,n);
if(1<d&&d<n)return d;
if(y==x)
return n;
if(i==k)
y=x,k<<=1;
}
}
void find(ll n,int c)
{
if(n==1)
return ;
if(Miller_Rain(n))
{
fac[ct++]=n;
return;
}
ll p=n;
ll k=c;
while(p>=n)
p=pollard_rho(p,c--);
find(p,k);
find(n/p,k);
}
unordered_map<ll,ll>vis;
ll gethash(ll a)
{
return a*13331+1e9+7;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
vis.clear();
ll n;
ct=0;
scanf("%lld",&n);
find(n,120);
bool fla=true;
for(int i=0;i<ct;i++)
{
if(!vis[fac[i]])
vis[fac[i]]=1;
else
fla=false;
}
if(fla)
puts("no");
else
puts("yes");
}
}