power products


解题思路:
tle思路:计算出每个值出现的次数,然后枚举x ,因为我看乘机最大也才1e10嘛 ,但是不行,当k=2的时候会卡,别的情况应该不会。哎,,

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int N=100010;
ll a[N];
const int mod = 998244353;
map<ll,int>mp;
ll qmi(ll a,int b)
{
   
	ll res=1;
	while(b)
	{
   
		if(b&1)  res=res*a;
		a = a*a;
		b>>=1;
	}
	return res;
}
int main()
{
   	
	int n,k;
	cin>>n>>k;
	ll maxv=0;
	for(int i=1;i<=n;i++)
		{
   
			cin>>a[i];
			mp[a[i]]++;
			maxv=max(maxv,a[i]);
		}
	ll res=0;
	ll ans2=0;
	for(int i=1;;i++)
	{
   
		ll tt=qmi(i,k);
		if(tt>maxv*maxv)	break;
		for(auto it:mp)
		{
   
			ll z = it.first;
			ll y = it.second;
			if(tt%z==0)
			{
   
				ll zz = tt/z;
				if(zz!=z)
					res+=y*mp[zz];
				else
					ans2+=mp[zz]*(mp[zz]-1)/2;
			} 
		}
	}
	cout<<res/2 + ans2	<<endl;
	return 0;

}

正确思路:我看了一个用哈希解决的方法,将所有数质因数分解,如果乘积是x的k次,那么他们每个质因数的幂一定是k的整数倍,我们将每个质因数的次数哈希,然后开一个bhash用来计算和它相补的值,最后用个map来查询bash哈希值对应的次数,最后加起来就是答案。

/*#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int N=100010;
ll a[N];
const int mod = 998244353;
map<ll,int>mp;
ll qmi(ll a,int b)
{
   
	ll res=1;
	while(b)
	{
   
		if(b&1)  res=res*a;
		a = a*a;
		b>>=1;
	}
	return res;
}
vector<ll>Q;
int main()
{
   	
	int n,k;
	cin>>n>>k;
	ll maxv=0;
	for(int i=1;i<=n;i++)
		{
   
			cin>>a[i];
			mp[a[i]]++;
			maxv=max(maxv,a[i]);
		}
	ll res=0;
	ll ans2=0;
	for(int i=1;;i++)
	{
   
		ll tt = qmi(i,k);
		if(tt>maxv * maxv)	break;
		Q.push_back(tt);
	}
	for(int i=0;i<Q.size();i++)
	{
   
		ll tt=Q[i];
		if(tt>maxv*maxv)	break;
		for(auto it:mp)
		{
   
			ll z = it.first;
			ll y = it.second;
			if(z*z>tt)	break;
			if(tt%z==0)
			{
   
				ll zz = tt/z;
				if(zz!=z)
					res+=y*mp[zz];
				else
					ans2+=mp[zz]*(mp[zz]-1)/2;
			} 
		}
	}
	cout<<res + ans2	<<endl;
	return 0;

}*/
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int N=100010;
ll a[N];
const int mod = 998244353;
typedef unsigned long long ull;
ull base = 131;
ull Hash[N];
int prime[N];
int cnt;
bool st[N];
int n,k;
int primeid[N];
void init()
{
   
	for(int i=2;i<N;i++)
	{
   
		if(!st[i])
			{
   
				primeid[i]=cnt;
				prime[cnt++]=i;
			}
		for(int j=0;i*prime[j]<=N-1;j++)
		{
   
			if(i%prime[j]==0)	break;
			st[i*prime[j]]=true;

		}
	}
}
map<ull,int>mp;
ll qmi(ll a,int b)
{
   
	ll res=1;
	while(b)
	{
   
		if(b&1)  res=res*a;
		a = a*a;
		b>>=1;
	}
	return res;
}
int work(int u)
{
   
	ll p = a[u];
	ull xhash=0;
	ull bhash=0;
	for(int i=0;i<cnt;i++)
	{
   
		if(prime[i]*prime[i]>p)	break;
		if(p%prime[i]==0)
		{
   
			int pcnt=0;
			while(p%prime[i]==0)
			{
   
				p/=prime[i];
				pcnt++;
				if(pcnt>=k)
					pcnt-=k;
			}
			xhash+=pcnt*Hash[i+1];
			bhash+=((k-pcnt)%k+k)%k*Hash[i+1];
		}
	}
	if(p!=1)
	{
   
		xhash+=1*Hash[primeid[p]+1];
		bhash+=(k-1)*Hash[primeid[p]+1];
	}
	ll	res=mp[bhash];
	mp[xhash]++;
	return res;
}
int main()
{
   	
	cin >> n >> k;
	for(int i=1;i<=n;i++)
	{
   
		cin>>a[i];
	}
	Hash[0]=1;
	init();
	//cout<<cnt<<endl;
	for(int i=1;i<cnt;i++)
		Hash[i]=Hash[i-1]*base;;
	ll res=0;
	for(int i=n;i>=1;i--)
		res+=work(i);
	cout<<res<<endl;
	return 0;

}
全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务