00000

#include<bits/stdc++.h>
typedef long long ll;
typedef __int128_t lll;
ll mulp(ll a,ll b,ll p){
	return a*(lll)b%p;
}
ll sqrp(ll a,ll k,ll p){
	return (a*(lll)a+k)%p;
}
ll gcd(ll a,ll b){return a?gcd(b%a,a):b;}
ll pollard(ll a,ll u,ll k){
	ll z=k,zz=sqrp(k,u,a);
	for(int i=0;i<1000000;++i){
		z=sqrp(z,u,a);
		zz=sqrp(zz,u,a);
		zz=sqrp(zz,u,a);
		ll t=gcd(zz-z+a,a);
		if(t!=1 && t!=a)return t;
	}return 0;
}
ll fac(ll a){
	for(int i=1;i<=11;++i)
		if(ll t=pollard(a,i,i))
			return t;
	return a;
}
int main(){
	ll a;
	while(~scanf("%lld",&a))
		printf("%lld
",fac(a));
	return 0;
}
原文地址:https://www.cnblogs.com/tmzbot/p/6747003.html