質問の意味は:X <Yと斧* AY kは数の力で満たし、あなたの正の整数nは、A1 ...等しい正の整数よりも大きなK 2を与える(x、y)の数を検索します。
実践:STLの基本的なアプリケーション。順序と素因数の素因数の数は各数kによってAIを求めながら、Bベクトル<ペア<INT、INT >>内に堆積AIは必要な電力と素因数の数になります別のベクター中の<ペア<INT、INT >> Cに格納された素因数の数。マップに<ベクトル<ペア<INT、INT >>、整数> Cの数を照会の数は、堆積物のB、回答統計結果は、特定の実装コードを参照します。
コード:
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int n, k;
long long ret;//此处要开long long,全为1的情况下会int溢出
int a[100005];
vector<pair<int, int> > b, c;
map<vector<pair<int, int>>, int> d;
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; ++i)
cin >> a[i];
for (int i = 1; i <= n; ++i)
{
b.clear();
c.clear();
int p = a[i], q;
for (int j = 2; j * j <= p; ++j)
{
if (p % j == 0)
{
q = 0;
while (p % j == 0)
{
p /= j;
q = (q + 1) % k;
}
if (q)
{
b.push_back(make_pair(j, q));
c.push_back(make_pair(j, k - q));
}
}
}
if (p > 1)
{
b.push_back(make_pair(p, 1));
c.push_back(make_pair(p, k - 1));
}
ret += d[c];
d[b]++;
}
cout << ret << endl;
return 0;
}