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;
}