题意:给定序列,要求在序列中找出最多的数,使得其中任意两个数相乘不是立方数。
思路:看了大牛的思路,%%%%%%,首先将每个数的因子的指数对三取模,发现同时也求出了当前数与之相乘为完全立方数的最简数,这里称其为补数,这里利用map记录一下补数是否出现,最后取当前数与补数的最大值(乱搞一通,智商-=inf)
#include<bits/stdc++.h>
#define debug puts("&&&&&&&&")
#define read(x) scanf("%lld",&x)
using namespace std;
typedef long long LL;
const int maxn=1e6+5;
const int maxx=1e10+2;
LL a[maxn];
LL b[maxn];
LL n;
map<LL,int>ma;
LL sqr(LL a) {
return a*a;
}
int main() {
while(cin>>n) {
ma.clear();
for(LL i=1;i<=n;i++) {
LL t;
cin>>t;
for(LL j=2;j*j*j<=t;j++) {
while(t%(j*j*j)==0) {
t/=(j*j*j);
}
}
ma[t]++;a[i]=t;
LL ans=1;
for(LL j=2;j*j*j<=t;j++) {
if(t%j==0) {
if(t%(j*j)==0) {
ans*=j;
}
else {
ans*=(j*j);
}
}
while(t%j==0) {
t/=j;
}
}
if (sqr((LL)sqrt(t))==t) ans*=(LL)sqrt(t);
else ans*=t*t;
b[i]=ans;
}
LL ans1=0;
if(ma[1]){
ans1++;
ma[1]=0;}
for(int i=1;i<=n;i++) {
ans1+=max(ma[a[i]],ma[b[i]]);
ma[a[i]]=ma[b[i]]=0;
}
cout<<ans1<<endl;
}
return 0;
}