官方题解好像和我不太一样。
首先 x=1 时答案为 1。
若 x 被分解成了 a11×a21…an1 且 n 是奇数,那么答案是 min(a1,a2,…,an)。
否则答案就是 1。求证明。
赛时代码:
#include<cstdio>
#define int long long
using namespace std;
const int N=1e5+10; int a[N],b[N];
signed main() {
int x,cnt=0,tx; scanf("%lld",&x),tx=x;
if(x==1) return printf("1"),0;
for(int i=2;i*i<=x;i++) {
if(x%i) continue;
a[++cnt]=i;
while(!(x%i)) x/=i,b[cnt]++;
}
if(x>1) a[++cnt]=x,b[cnt]=1;
if(cnt==1) return printf("%lld",tx),0;
bool flag=true;
for(int i=1;i<=cnt;i++) if(b[i]!=1) { flag=false; break; }
if(flag) {
if(cnt&1) printf("%lld",a[1]);
else printf("1");
}
else printf("1");
return 0;
}