タイトル
質問の意味:
所定数N、出力点の数は、任意の番号(i <j)の[I] * [J] = k番目のパワーを満たします。
分析:
各数値は、その後、明らかに彼らの素因数にも条件を満足する条件を満たすように2つの数値を乗じ、素因数に分解されます。素数の因数分解我々はそう、ベクター配列、品質係数と格納されたインデックスに対応する配列の各要素、モジュロ・インデックスkの応答を形成し、その整合配列は、対応するインデックスK-指標です。このベクトルを格納マップには、ログインすることができます(n)を見つけるために。
#include <iostream>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
vector<pair<int,int> > temp;
map<vector<pair<int,int> >,int> ma;
void divide(int n,int k)
{
int a = n;
for (int i = 2; i * i <= n; i++)
{
if( a % i == 0 )
{
int num = 0;
while( a % i == 0 )
{
a /= i;
num ++;
}
num %= k;
if( num != 0 ) temp.push_back(make_pair(i,num));
}
}
if( a > 1 ) temp.push_back(make_pair(a,1));
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,k;
cin >> n >> k;
ll ans = 0;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
temp.clear();
divide(x,k);
vector<pair<int,int> > aim;
for (int i = 0; i < temp.size(); i++)
{
aim.push_back(make_pair(temp[i].first,k-temp[i].second));
}
ans += ma[aim];
ma[temp]++;
}
cout << ans << '\n';
return 0;
}