D. Power Products
time limit per test
2 seconds
memory limit per test
512 megabytes
input
standard input
output
standard output
You are given nn positive integers a1,…,ana1,…,an, and an integer k≥2k≥2. Count the number of pairs i,ji,j such that 1≤i<j≤n1≤i<j≤n, and there exists an integer xx such that ai⋅aj=xkai⋅aj=xk.
Input
The first line contains two integers nn and kk (2≤n≤1052≤n≤105, 2≤k≤1002≤k≤100).
The second line contains nn integers a1,…,ana1,…,an (1≤ai≤1051≤ai≤105).
Output
Print a single integer — the number of suitable pairs.
Example
input
Copy
6 3
1 3 9 8 24 1
output
Copy
5
Note
In the sample case, the suitable pairs are:
- a1⋅a4=8=23a1⋅a4=8=23;
- a1⋅a6=1=13a1⋅a6=1=13;
- a2⋅a3=27=33a2⋅a3=27=33;
- a3⋅a5=216=63a3⋅a5=216=63;
- a4⋅a6=8=23a4⋅a6=8=23.
我写了很暴力的方法
分解质因子,然后计算出每个数要构成k次方数,所需的剩余因子个数
然后映射一个数量 每次查询map
用一个map<vector<pair<int,int> >,int> 来对应每个数所需要的因子和个数即可
#include<bits/stdc++.h>
using namespace std;
map<vector<pair<int,int> >, int>mp;
int main()
{
int n,k;
scanf("%d%d",&n,&k);
long long ans=0;
for(int i=1;i<=n;i++)
{
vector<pair<int,int> >ve;
ve.clear();
int tmp,temp;
scanf("%d",&tmp);
ve.push_back(make_pair(1,1));
temp=sqrt(tmp);
for(int j=2;j<=temp;j++)
{
int num=0;
while(tmp%j==0)
{
tmp/=j;
num++;
}
num%=k;
if(num!=0)
{
ve.push_back(make_pair(j,num));
//cout<<j<<" "<<num<<endl;
}
}
if(tmp!=1)
{
ve.push_back(make_pair(tmp,1));
//cout<<tmp<<" "<<1<<endl;
}
ans+=mp[ve];
for(int j=1;j<ve.size();j++)
{
ve[j].second=k-ve[j].second;
}
//cout<<ve[1].second<<endl;
mp[ve]++;
//cout<<ans<<endl;
}
printf("%I64d
",ans);