我是靠谱客的博主 迅速耳机,最近开发中收集的这篇文章主要介绍【codeforces 1225D】Power Products,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题意

计算满足 a i ∗ a j = x k , i < j a_{i}*a_{j}=x^k,i<j aiaj=xk,i<j的对数。

思路

考虑 x ∗ y = p k x*y=p^k xy=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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部