请求优化
查看原帖
请求优化
53548
Nowed楼主2020/7/31 14:25

为什么#13总是TLE。。。

#pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")
#include<cstdlib>
#include<algorithm>
#include<cstdio>
#define rr register 
#define mytz __builtin_ctzll
const int Times=10,N=5500; 
using namespace std; 
typedef long long LL; 
LL ct,cnt/*,fac[N],num[N]*/,tot; 
/*inline LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}*/
inline LL gcd(rr LL a,rr LL b){
    if(!a) return b;
    if(!b) return a;
    rr int t=mytz(a|b) ;
    a>>=mytz(a) ;
    do{
        b>>=mytz(b) ;
        if(a>b){LL t=b;b=a,a=t;}
        b-=a;
    }while(b); 
    return a<<t;
}
inline LL multi(rr LL a,rr LL b,rr LL m){
	rr LL ans=0; a%=m; 
	for(;b;b>>=1,a=(a+a)%m)	if (b&1) ans=(ans+a)%m; 
	return ans; 
}
inline LL quick_mod(rr LL a,rr LL b,rr LL m){
	LL ans=1; a%=m;
	for(;b;b>>=1,a=multi(a,a,m)) if (b&1) ans=multi(ans,a,m); 
	return ans; 
}
inline bool Miller_Rabin(rr LL n){
	if (n==2) return true; 
	if (n<2||!(n&1)) return false; 
	rr LL m=n-1; rr int k=0; 
	for (;(m&1)==0;m>>=1) k++; 
	for (rr int i=0;i<Times;i++){
		rr LL a=rand()%(n-1)+1,x=quick_mod(a,m,n),y=0; 
		for(rr int j=0;j<k;j++){
			y=multi(x,x,n); 
			if (y==1&&x!= 1&&x!=n-1) return false; 
			x=y; 
		}
		if (y!=1) return false; 
	}
	return true; 
}
inline LL pollard_rho(rr LL n,rr LL c){
	register LL i=1,k=2,x=rand()%(n-1)+1,y=x; 
	while (true){
		i++; 
		x=(multi(x,x,n)+c)%n; 
		rr LL d=gcd((y-x+n)%n,n); 
		if (1<d&&d<n) return d; 
		if (y==x) return n; 
		if (i==k) y=x,k<<=1;
	}
}
inline void find(rr LL n,rr int c){
	if (n==1) return; 
	if (Miller_Rabin(n)){/*fac[ct++]=n;*/ tot=max(n,tot); return;}
	rr LL p=n,k=c; 
	while (p>=n) p=pollard_rho(p,c--); 
	find(p,k),find(n/p,k); 
}
int main(){
	rr LL n,T; 
	scanf("%lld",&T); 
	while (T--){
		scanf("%lld",&n); 
		if (Miller_Rabin(n)) {printf("Prime\n"); continue; }
		tot=0; 	/*ct=0;*/ find(n,127); 
		printf("%lld\n",tot); 
	/*	sort(fac,fac+ct); 
		num[0]=1; 
		int k=1;
		for (int i=1;i<ct;i++){
			if (fac[i]==fac[i-1]) ++num[k-1]; else {
				num[k]=1; 
				fac[k++]=fac[i]; 
			}
		}
		cnt=k; 
		for(int i=0;i<cnt;i++) printf("%lld^%lld ",fac[i],num[i]); 		
		printf("\n"); */
	}
	return 0;
}
2020/7/31 14:25
加载中...