パワー製品 - #596 DIV2のD Codeforces

質問の意味は: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;
}

おすすめ

転載: www.cnblogs.com/mapleaves/p/11775841.html