求助水题!
查看原帖
求助水题!
590600
Kreado楼主2022/12/19 21:10

感觉在洛谷 IDE 上很快啊……

但还是 TLE 了,嘤嘤嘤。

#include <bits/stdc++.h>
#define ll __int128
#define Auto vector<ll>::iterator
using namespace std;
const ll Maxn=610,inf=0x3f3f3f3f;
vector<ll>S;
inline ll qread(){
	ll x=0;int f=1;char ch;
	while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=0;x=(ch^48);
	while((ch=getchar())>='0'&&ch<='9') x=x*10+(ch^48);
	return f?x:-x;
}
inline void print(ll x){
	if(x>9) print(x/10);
	putchar('0'+(x%10));
}
namespace Math{
	ll mul(ll a,ll b,ll p){return (a*b-(ll)((__float128)a/p*b)*p+p)%p;}
	inline ll ksm(ll a,ll b,ll p){
		a%=p;
		ll res=1;
		for(;b;b>>=1,a=mul(a,a,p))if(b&1)res=mul(res,a,p);
		return res;
	}
	inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
}
using namespace Math;
namespace Miller_Rabin{
	ll Test[11]={0,2,61};
	inline bool Prime(ll X){
		if(X<2) return false;
		ll t=X-1;ll k=0;
		while(1^(t&1)) t>>=1,++k;
		for(ll i=1;i<=2;i++){
			if(X==Test[i]) return true;
			ll A=ksm(Test[i],t,X),Next=A;
			for(ll j=1;j<=k;j++){
				Next=mul(A,A,X);
				if(Next==1&&A!=1&&A!=X-1) return false;
				A=Next;
			}
			if(Next!=1) return false;
		}
		return true;
	}
}
using namespace Miller_Rabin;
namespace Pollard_Rho{
	#define Rand(P) (rand()*rand()%(P)+1)
	inline ll PR(ll X,ll Y){
		ll t=0,k=1,v0=Rand(X-1),v1=v0,d,s=1;
		while(true){
			v1=(mul(v1,v1,X)+Y)%X;s=mul(s,abs(v1-v0),X);
			if(!(v1^v0)||!s) return X;
			if(++t==k){if((d=gcd(s,X))^1)return d;v0=v1;k<<=1;}	
		}
	}
	inline void solve(ll X){
		if(!(1^X)) return ;
		if(Prime(X)){S.push_back(X);return ;}
		ll Y=X;while((Y=PR(X,Rand(X)))==X);while(!(X%Y)) X/=Y;
		solve(X);solve(Y);
	}
}
ll m,a,ans1=-inf,cnt;
int main(){
	srand(time(0));
	while(m=qread()){
		S.clear();Pollard_Rho::solve(m);
		sort(S.begin(),S.end());
		S.resize(unique(S.begin(),S.end())-S.begin());
		for(Auto it=S.begin();it!=S.end();it++){
			ll t=*it;
			print(t),printf("^");
			int k=0;while(m%t==0) m/=t,++k;
			printf("%d ",k);
		}	
		puts(" ");
	}
	return 0;
}
2022/12/19 21:10
加载中...