ABC d 求调
  • 板块学术版
  • 楼主__vector__
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/12/3 21:42
  • 上次更新2023/10/27 00:34:19
查看原帖
ABC d 求调
507348
__vector__楼主2022/12/3 21:42

RT. 一直 WA 3 个点。小号掉棕,心态炸了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e6+5;
ll k;
ll gcd(ll a,ll b)
{
	return !b?a:gcd(b,a%b);
}
ll prim[maxn];
bool vis[maxn];
bool isch[maxn];
int top;
int main()
{
	for(int i=2;i<=5000000;i++){
		if(!vis[i])
		{
			prim[++top]=i;
		}
		for(int j=1;j*i<=5000000;j++)
		{
			vis[i*j]=1;
		}
	}
	scanf("%lld",&k);
	bool prime=1;
	for(ll i=2;i*i<=k;i++)
	{
		if(k%i==0)
		{
			prime=0;
			break;
		}
	}
	if(prime)
	{
		printf("%lld",k);
		return 0;
	}
	ll ans=0;
	ll rem=k;
	for(int i=1;i<=top;i++)
	{
		if(k%prim[i]==0)
		{
			ans=max(ans,prim[i]);
			k/=prim[i];
			isch[prim[i]]=1;
		}
		if(k==1)
		{
			printf("%lld",ans);
			return 0;
		}
	}
	for(ll i=2;i*i<=rem+200000000;i++)
	{
		if(isch[i])continue;
		isch[i]=1;
		//	printf("i: %lld k: %lld gcd: %lld\n",i,k,gcd(i,k));
		if(gcd(i,k)>1)
		{
			ans=max(ans,i);
		}
		k/=gcd(i,k);
		if(k==1)
		{
			printf("%lld",max(ans,i));
			return 0;
		}
	}
	//	printf("i: %lld\n",k);
	if(k>500000||!isch[k])
		ans=max(ans,min(rem,k));
	printf("%lld",ans);
	return 0;
}
2022/12/3 21:42
加载中...