求助 RE
查看原帖
求助 RE
537046
大眼仔Happy楼主2024/2/26 21:13
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define ll long long
ll inline read()
{
    ll num=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
    return num*f;
}
int n,id,ans,flag,tot;ll a[N],X[N],Y[N];
bool vis[N];ll p[N];
void init()
{
    for(int i=2;i<=2160;i++)
    {
        if(!vis[i])p[++tot]=i;
        for(int j=1;i*p[j]<=2160;j++)
        {
            vis[i*p[j]]=1;
            if(i%p[j]==0)break;
        }
    }
}
map<ll,int>t,used;
void split(ll x)
{
    id++;ll sx=1,sy=1;
    for(ll i=1,j=2;j*j*j<=x;i++,j=p[i])
    {
        ll b=j*j*j;
        while(x%b==0)x/=b;
        if(x%j==0){sy*=b;while(x%j==0)x/=j,sy/=j,sx*=j;}
    }
    if(x!=1)
    {
        ll m=sqrt(x);
        if(m*m==x)sx*=x,sy*=m;
        else sx*=x,sy*=(x<=100000ll)?x*x:0;
    }
    t[sx]++;X[id]=sx;Y[id]=sy;
}
int main(){
    init();
    n=read();
    for(int i=1;i<=n;i++)split(a[i]=read());
    for(int i=1;i<=n;i++)
    {
        if(X[i]==1){flag=1;continue;}
        if(!used[X[i]]&&!used[Y[i]])
        {
            int num1=t[X[i]],num2=t[Y[i]];
            if(num1<num2)ans+=num2,used[Y[i]]=1;
            else ans+=num1,used[X[i]]=1;
        }
    }
    printf("%d",flag+ans);
    return 0;
}
2024/2/26 21:13
加载中...