Codeforces #596 div2 D - Power Products

题意:给你n个正整数a1…an和一个大于等于2的正整数k,求有多少对(x, y)满足x<y且ax*ay是某个数的k次方。

做法:STL的基本应用。按顺序将每个ai的素因子和素因子个数存进一个vector<pair<int, int>> b中,同时求ai乘某个数变为某个数的k次方需要的素因子和素因子个数,存进另一个vector<pair<int, int>> c中。在map<vector<pair<int, 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