完全平方数题解

题意

n 个数选若干个使其相乘为完全平方数,问完全平方数最大是多少。

思路

完全就是两个相同的数相乘,所以我们可以对于 ≤n 的数分解质因子,然后每个质因子取偶数个,将他们相乘就行

细节

相乘时要用快速幂,记得开 long long

普通的分解质因子不管怎么样都是 TLE 的用我以下代码只能拿到 85

#include<bits/stdc++.h>
using namespace std;
const int Mod=1e8+7;
long long cnt,n,ans=1;
int nex[5000005],prime[5000005],s[5000005];
bool vis[5000005];
long long fz(long long a, long long b, long long c)
{
	if(b==0) return 1;
    if(b==1) return a%c;
    long long t=fz(a,b/2,c)%c;
    return (((t*t)%c)*(b%2==0?1:a%c))%c;
}
int main()
{
	cin>>n;
	vis[1]=1;
	for(int i=1;i<=n;++i)
	{
		if(!vis[i]) nex[i]=i,prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=n;++j)
		{
			nex[i*prime[j]]=prime[j];
			vis[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		}
	}
	nex[1]=0;
	for(int i=1;i<=n;++i)
	{
		int x=i;
		while(nex[x])
		{
			s[nex[x]]++;
			x/=nex[x];
		}
	}
	for(int i=1;i<=n;++i) ans*=fz(i,s[i]/2*2,Mod),ans%=Mod;
	cout<<ans;
	return 0;
}

时间复杂度

<O(n log n) 可过此题

1 个赞

@金杭东 letex炸了

1 个赞

暑假题这时候拿来发是吧

你不也是

那是暑假发的只不过我改了个标签(Doge