概述
题意
计算满足 a i ∗ a j = x k , i < j a_{i}*a_{j}=x^k,i<j ai∗aj=xk,i<j的对数。
思路
考虑
x
∗
y
=
p
k
x*y=p^k
x∗y=pk,将
x
x
x和
y
y
y进行质因子分解可得:
x
=
p
1
m
1
p
2
m
2
p
3
m
3
.
.
.
p
n
m
n
x=p_1^{m_1}p_2^{m_2}p_3^{m_3}...p_n^{m_n}
x=p1m1p2m2p3m3...pnmn
y
=
q
1
t
1
q
2
t
2
q
3
t
3
.
.
.
q
n
t
n
y=q_1^{t_1}q_2^{t_2}q_3^{t_3}...q_n^{t_n}
y=q1t1q2t2q3t3...qntn
如果对于 x x x和 y y y有着不同的质因子,那么该质因子的次数一定是 k k k的倍数,如果有着相同的质因子,那么 t i + m i t_i+m_i ti+mi也一定是 k k k的倍数,因此,可以考虑把 a i a_i ai进行质因子分解,将幂次模 k k k后构造成新的数字即可把每个数字压缩,这样只需要考虑 t i + m i = k t_i+m_i=k ti+mi=k的情况,利用map存一下然后 O ( n ) O(n) O(n)的扫一遍即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+100;
long long a[N],b[N];
typedef long long ll;
map<ll,ll> nums;
ll qp(ll a,ll b){
ll ans=1;
while(b){
if(b&1) ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
int main(){
long long n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
ll now=1;
ll need=1;
for(ll j=2;j*j<=a[i];j++){
if(a[i]%j==0){
int cnt=0;
while(a[i]%j==0){
++cnt;
a[i]/=j;
}
cnt%=k;
now*=qp(j,cnt);
}
}
if(a[i]!=1){
now*=a[i];
}
a[i]=now;
nums[a[i]]++;
for(ll j=2;j*j<=now;j++){
if(now%j==0){
int cnt=0;
while(now%j==0){
++cnt;
now/=j;
}
need*=qp(j,k-cnt);
}
}
if(now!=1){
need*=qp(now,k-1);
}
b[i]=need;
}
ll ans=0;
for(int i=1;i<=n;i++){
if(b[i]==a[i]){
ans+=nums[b[i]]-1;
}else{
ans+=nums[b[i]];
}
}
cout<<ans/2<<endl;
return 0;
}
最后
以上就是迅速耳机为你收集整理的【codeforces 1225D】Power Products的全部内容,希望文章能够帮你解决【codeforces 1225D】Power Products所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复