【map的使用】【例题向】CF1247D Power Products

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42725189/article/details/102775319
  • 题目大意:给定一个长1e5的数列和k,求出能使乘积等于 x k x^k 的数对的数量。
  • 思路:要得到 x k x^k ,那一定每一个质因数个数都是k的倍数。所以可以求出一个数的质因数与其个数,然后对k取模,即可得到当前数产生贡献的条件,最后放入map查询
  • 详见代码
#include<bits/stdc++.h>
using namespace std;
map<vector<pair<int,int> >,int>mp;//vector存入map即可映射出int
vector<pair<int,int> >v;
int n,k;
long long ans;
int main()
{
	scanf("%d%d",&n,&k);
	for(int a,sqa,i=1;i<=n;i++)
	{
		scanf("%d",&a);
		sqa=sqrt(a);
		v.clear();
		for(int num,j=2;j<=sqa;++j)
		{
			num=0;
			while(a%j==0)
			{
				num++;
				a/=j;
			}
			num%=k;//取模
			if(num)
			{
				v.push_back(make_pair(j,num));//有num个j
			}
		}
		if(a!=1)
		v.push_back(make_pair(a,1));
		ans+=mp[v];
		for(int j=0;j<v.size();++j)
		{
			v[j].second=k-v[j].second;//产生贡献的条件是两个数积的每个质因数相加为k
		}
		mp[v]++;//存入map
	}
	printf("%lld",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_42725189/article/details/102775319
今日推荐