神奇TLE5pts求助
查看原帖
神奇TLE5pts求助
1601965
fangtongsheng楼主2025/1/30 20:45

只有第十二个点过了。马蜂较优.

其中 Pollard-Rho 的判素用了费马小定理,已倍增优化、开__int128。

Q:分解函数 fac 中未剪枝不知道行不行

#include<bits/stdc++.h> 
using namespace std;
using ll = __int128;

// Start  ***************************
ll ffpow(ll a,ll base,ll mod) { 
	ll res=1,x=a;
	while(base) {
		if(base&1) res=res*x%mod;
		base>>=1,x=x*x%mod;
	}
	return res;
}
inline bool fer(ll a,ll b) {
	return a%b==0||(a+1)%b==0||(a-1)%b==0||ffpow(a,b-1,b)==1;
}
bool check(ll x) {
	if(x<2) return 0;
	if(!(x&1)) return x==2;
	return fer(2,x)&&fer(3,x)&&fer(5,x)&&fer(7,x)&&fer(11,x)&&fer(13,x)
		&&fer(17,x)&&fer(19,x)&&fer(23,x)&&fer(29,x)&&fer(31,x)&&fer(37,x);
}
// End ************************

ll gcd(ll aa,ll bb)
{
	if(bb==0) return aa;
	return gcd(bb,aa%bb);
}
long long n;
long long T;
inline ll f(ll pos,ll now,ll c){ // Next Step  
	return (pos*pos+c)%(now-1)+1;
}
ll rho(ll a)
{
	ll c=1ll*rand()%(a-1)+1;
	ll u=0,v=0,d;
	ll val=1;
	for(int len=1;   ;len<<=1,u=v,val=1){
		for(int i=0;i<=len;i++){
			v=f(v,a,c);
			val=val*((u>v)?u-v:v-u)%a;
			if(val==0) return a;
			if((i%127)==0) {
				d=gcd(((u>v)?u-v:v-u),a);
				if(d>1) return d;
			}
		}
		d=gcd(((u>v)?u-v:v-u),a);
		if(d>1) return d;
	}
	return a;
}
long long mx=0;
void fac(ll x)
{
	if(x<2||x<=mx) return;
	if(check(x)) {
		mx=max(mx,(long long)x);
		return;
	}
	ll p=x;
	while(p>=x) p=rho(x);
	while((x%p)==0) x/=p;
	fac(x),fac(p);
}
void MyWork()
{
	cin>>n;
	mx=0;
	if(check(n)) {
		puts("Prime");
		return;
	}
	fac(n);
	printf("%d\n",mx);
}
int main() {
	srand((__int128)time(NULL));
	cin>>T;while(T--) MyWork();
	return 0;
}

2025/1/30 20:45
加载中...