题目连接:
题解:
根据题目的意思,对每个X进行质因子分解,保存其质因子以及质因子出现的个数,如果两个数的乘积变成一个数的K次幂,那么两个数的质因子的指数之间相加应为k的倍数。保存完毕后,开始遍历,将与其互补的质因子与指数保存一下
。然后查找,这里需要借用STL里map嵌套vector,即map<vector<stu >,int >mp;还要定义一个结构体用来保存质因子与其指数。最后一步是查找,直接用我们mp[v1],其中V1是我们刚才保存好与该互补的一方。
,
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,k; struct stu{ ll a,b; bool friend operator < (const stu &x, const stu &y){ if(x.a!=y.a) return x.a>y.a; return x.b>y.b; } }; vector<stu> ve,v1; map< vector<stu > ,ll >mp; ll ans=0; void prime(ll x){ ve.clear(); v1.clear(); stu a1,a2; ll x1=x; for(ll i=2;i<=sqrt(x1);i++){ ll s=0; if(x1%i==0){ while(x1%i==0){ x1/=i; s++; } a1.a=i; a1.b=s%k; } if(s%k) ve.push_back(a1);//如果为k的倍数的话,就没必要保存了,因为这里的质因子i的指数不需要互补 } if(x1!=1) ve.push_back({x1,1}); sort(ve.begin(),ve.end()); for(int i=0;i<ve.size();i++){ ll dx=ve[i].a; ll dy=ve[i].b; if((k-dy)%k) v1.push_back({dx,(k-dy)%k}); } sort(v1.begin(),v1.end()); ans+=mp[v1]; mp[ve]++; } int main(){ cin>>n>>k; for(int i=1;i<=n;i++){ ll x; cin>>x; prime(x); } cout<<ans<<endl; return 0; }