版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
- 题目大意:给定一个长1e5的数列和k,求出能使乘积等于 的数对的数量。
- 思路:要得到 ,那一定每一个质因数个数都是k的倍数。所以可以求出一个数的质因数与其个数,然后对k取模,即可得到当前数产生贡献的条件,最后放入map查询
- 详见代码
#include<bits/stdc++.h>
using namespace std;
map<vector<pair<int,int> >,int>mp;//vector存入map即可映射出int
vector<pair<int,int> >v;
int n,k;
long long ans;
int main()
{
scanf("%d%d",&n,&k);
for(int a,sqa,i=1;i<=n;i++)
{
scanf("%d",&a);
sqa=sqrt(a);
v.clear();
for(int num,j=2;j<=sqa;++j)
{
num=0;
while(a%j==0)
{
num++;
a/=j;
}
num%=k;//取模
if(num)
{
v.push_back(make_pair(j,num));//有num个j
}
}
if(a!=1)
v.push_back(make_pair(a,1));
ans+=mp[v];
for(int j=0;j<v.size();++j)
{
v[j].second=k-v[j].second;//产生贡献的条件是两个数积的每个质因数相加为k
}
mp[v]++;//存入map
}
printf("%lld",ans);
}