# 596 라운드 Codeforces는 D. 파워 제품 数学 (사업부. 2, Technocup 2020 제거 라운드 2 기준) 暴力

D. 파워 제품

주어진 n은 양의 정수의 A1, ..., AN, 및 정수 k≥2. 되도록 1≤i <j≤n, J를 I 쌍의 수를 카운트하고, 정수 X =되도록 ai⋅aj XK이 존재한다.

입력

첫 번째 라인은 두 정수 N과 K (2≤n≤105, 2≤k≤100)을 포함한다.

두 번째 행은 N 개의 정수 A1, ..., (1≤ai≤105)을 포함한다.

산출

적절한 쌍의 수 - 하나의 정수를 인쇄합니다.

입력
6 3
1 3 24 9 8 1
출력
5

노트

샘플의 경우, 적절한 쌍은 :

a1⋅a4 = 8 = 23;
a1⋅a6 = 1 = 13;
a2⋅a3 = 27 = 33;
a3⋅a5 = 216 = 63;
a4⋅a6 = 8 = 23.

문제의 의미

제목 때문에, 짧은 내가 게으른 번역하지 않습니다. .

문제 해결

두 수의 소인수 분해 한 후, 그 풀수 K의 배수 인 경우 첫째, 숫자의 각 요소의 수를 주요 인수 분해를 우리.

그럼 다음 벡터 이동을 사용하는 쌍을 찾아, 각 소인수로 분해 할 수 있습니다.

코드

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int n,k;
int a[maxn];
map<vector<pair<int,int> >,int>H;
int main(){
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    long long ans = 0;
    for(int i=0;i<n;i++){
        string tmp="";
        vector<pair<int,int> >fac;
        for(int now=2;now*now<=a[i];now++){
            int number=0;
            while(a[i]%now==0){
                a[i]/=now;
                number+=1;
            }
            if(number%k)
                fac.push_back(make_pair(now,number%k));
        }
        if(a[i]>1)fac.push_back(make_pair(a[i],1%k));
        vector<pair<int,int> >fac2;
        for(int j=0;j<fac.size();j++){
            fac2.push_back(make_pair(fac[j].first,k-fac[j].second));
        }
        ans+=H[fac2];
        H[fac]++;
    }
    cout<<ans<<endl;
}

추천

출처www.cnblogs.com/qscqesze/p/11774771.html