This documentation is automatically generated by online-judge-tools/verification-helper
 osa_k法 (Factorization Queries)
 osa_k法 (Factorization Queries)
    #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;
    }
};