:warning: osa_k法
(math/osa_k.hpp)

Code

#pragma once
#include<map>

/**
 * @brief osa_k法
 */

std::map<int,int> osa_k(int n){
    constexpr int mx=10'000'000;
    assert(n<mx);
    static bool init=false;
    static int v[mx];
    static vector<int>pr;
    if(!init){
        init=true;
        for(int i=2;i<mx;++i){
            if(v[i]==0){
                v[i]=i;
                pr.push_back(i);
            }
            for(int j=0;j<(int)pr.size() && pr[j]<=v[i] && i*pr[j]<mx;++j){
                v[i*pr[j]]=pr[j];
            }
        }
    }
    map<int,int>ret;
    while(n!=1){
        ret[v[n]]++;
        n/=v[n];
    }
    return ret;
}
#line 2 "math/osa_k.hpp"
#include<map>

/**
 * @brief osa_k法
 */

std::map<int,int> osa_k(int n){
    constexpr int mx=10'000'000;
    assert(n<mx);
    static bool init=false;
    static int v[mx];
    static vector<int>pr;
    if(!init){
        init=true;
        for(int i=2;i<mx;++i){
            if(v[i]==0){
                v[i]=i;
                pr.push_back(i);
            }
            for(int j=0;j<(int)pr.size() && pr[j]<=v[i] && i*pr[j]<mx;++j){
                v[i*pr[j]]=pr[j];
            }
        }
    }
    map<int,int>ret;
    while(n!=1){
        ret[v[n]]++;
        n/=v[n];
    }
    return ret;
}
Back to top page