素因数分解(高速)
(give_us_tmp/factorize.cpp)
Code
/**
* @brief 素因数分解(高速)
*
* verified with :https://judge.yosupo.jp/problem/factorize
* submission :https://judge.yosupo.jp/submission/28308
*/
void __factorize(ll n,ll& c,V<ll>& v){
if(n==1)return;
if(n%2==0){
v.emplace_back(2);
__factorize(n/2,c,v);
return;
}
if(is_prime(n)){
v.emplace_back(n);
return;
}
while(1){
long long x=2,y=2,d=1;
while(d==1){
x=((__int128_t)x*x+c)%n;
y=((__int128_t)y*y%n+c)%n;
y=((__int128_t)y*y%n+c)%n;
d=std::gcd(std::abs(x-y),n);
}
if(d==n){
c++;
continue;
}
__factorize(d,c,v);
__factorize(n/d,c,v);
return;
}
}
map<ll,ll> factorize(ll n){
V<ll>v;
ll c=1;
__factorize(n,c,v);
map<ll,ll>m;
for(auto e:v){
m[e]++;
}
return m;
}
#line 1 "give_us_tmp/factorize.cpp"
/**
* @brief 素因数分解(高速)
*
* verified with :https://judge.yosupo.jp/problem/factorize
* submission :https://judge.yosupo.jp/submission/28308
*/
void __factorize(ll n,ll& c,V<ll>& v){
if(n==1)return;
if(n%2==0){
v.emplace_back(2);
__factorize(n/2,c,v);
return;
}
if(is_prime(n)){
v.emplace_back(n);
return;
}
while(1){
long long x=2,y=2,d=1;
while(d==1){
x=((__int128_t)x*x+c)%n;
y=((__int128_t)y*y%n+c)%n;
y=((__int128_t)y*y%n+c)%n;
d=std::gcd(std::abs(x-y),n);
}
if(d==n){
c++;
continue;
}
__factorize(d,c,v);
__factorize(n/d,c,v);
return;
}
}
map<ll,ll> factorize(ll n){
V<ll>v;
ll c=1;
__factorize(n,c,v);
map<ll,ll>m;
for(auto e:v){
m[e]++;
}
return m;
}
Back to top page