求助,质因数分解,时间复杂度感觉正确,但是T到飞起
查看原帖
求助,质因数分解,时间复杂度感觉正确,但是T到飞起
649095
幻想繁星NM 猫猫可爱楼主2023/2/25 15:09
#include<bits/stdc++.h>
using namespace std;
int l=0,n[1000006],t,maxn;
bool v[(int)1e8+1];
int s[(int)1e8];
int main()
{
	t=read();
	for(int i=1;i<=t;i++)
	{
		n[i]=read();
		maxn=max(n[i],maxn);
	}
	for(int i=2;i<=maxn/2;i++)//筛到最大的n的一半 
	{
		if(v[i]==0) s[l++]=i;
		for(int j=0;j<l&&i*s[j]<=maxn;j++)
		{
			v[i*s[j]]=1;	
			if(i%s[j]==0) break;
		}
	}
	for(int i=1;i<=t;i++)
	{
		int ans=0;
		for(int j=0;j<l;j++)//枚举所有素数 
		{
			if(s[j]>n[i])//n是素数 
				break;
			while(n[i]%(s[j]*s[j])==0)//n有多个成对的质因数 
				n[i]/=s[j]*s[j];
			if(n[i]%s[j]==0)//n有该质因数 
			{
				n[i]/=s[j];
				ans^=s[j];
			}
			if(n[i]==1)//分解完毕 
				break;
		}
		if(n[i]>1)//n是素数
		{
			cout<<n[i]<<"\n";
			continue;
		}
		cout<<ans<<'\n';
	}
	return 0;
}
2023/2/25 15:09
加载中...