标签:pair push 质因数 for 相同 while ++ cto lld
每一个数在质因数分解的时候记录与x相同质因数相加是k的倍数的状态为x1
用map维护每一个状态的合法总数,答案加上mp[x1],把mp[x]+1就好了
map <vector< pair<int,int> > , int > mp;
vector<pair<int,int>> x,x1;
int n,k,a[300005];
long long ans=0;
int main() {
scanf("%d%d",&n,&k);
for (int i=1;i<=n;++i) {
scanf("%d",&a[i]);
x.clear();x1.clear();
int aa=a[i];
for (int j=2;j*j<=a[i];++j) {
int tot=0;
while(aa%j==0) {
++tot;
aa/=j;
tot%=k;
}
if(!tot) continue;
x.push_back({j,tot});
x1.push_back({j,k-tot});
}
if(aa!=1) {
x.push_back({aa,1});
x1.push_back({aa,k-1});
}
ans=ans+mp[x1];
++mp[x];
}
printf("%lld\n",ans);
}
标签:pair push 质因数 for 相同 while ++ cto lld
原文地址:https://www.cnblogs.com/shikeyu/p/13726016.html