This documentation is automatically generated by online-judge-tools/verification-helper
#include "Math/FactorizeQueries.hpp"
エラトステネスの篩の要領で前処理をしておくと素因数分解を高速にできる場合がある.
Mを素因数分解した最大の数とし,Nを素因数分解する時.
// Precomputation : O(M log (log M)) (M : MAX)
// Factorize Query : O(log N) (N<=MAX)
template<int MAX>
struct FactorizeQueries{
vector<int> min_factor;
FactorizeQueries(){
min_factor.resize(MAX+1);
iota(begin(min_factor),end(min_factor),0);
for(int i=2;i*i<=MAX;i++){
if(min_factor[i]==i)
for(int j=i+i;j<=MAX;j+=i) min_factor[j]=min(min_factor[j],i);
}
}
vector<int> Factorize(int x){
assert(x<=MAX);
vector<int> ret;
for(;x>1;x/=min_factor[x]) ret.push_back(min_factor[x]);
return ret;
}
};
#line 1 "Math/FactorizeQueries.hpp"
// Precomputation : O(M log (log M)) (M : MAX)
// Factorize Query : O(log N) (N<=MAX)
template<int MAX>
struct FactorizeQueries{
vector<int> min_factor;
FactorizeQueries(){
min_factor.resize(MAX+1);
iota(begin(min_factor),end(min_factor),0);
for(int i=2;i*i<=MAX;i++){
if(min_factor[i]==i)
for(int j=i+i;j<=MAX;j+=i) min_factor[j]=min(min_factor[j],i);
}
}
vector<int> Factorize(int x){
assert(x<=MAX);
vector<int> ret;
for(;x>1;x/=min_factor[x]) ret.push_back(min_factor[x]);
return ret;
}
};