大质数分解板题(威海)

思路:
如果一个数被质因数分解后,产生的素数个数没有重复的,呢么答案就只有一个。
参考代码

#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");
  }
}

猜你喜欢

转载自blog.csdn.net/yangzijiangac/article/details/109314502