素数を見つけるとn Oであるためには(N)

\(\ mathcal {AIM} \)

:私たちは、ことを知っている
合成数については\(X \)持っている\(X = P ^ {A_1
} _1 * P ^ {A_2} _2 * ... * P ^ {} A_N _n \) 現在与えます\(N-を\)を見つけるにおけるX \(\ [1、N-] \) 全ての\(X \)分解\(P \)電源の数と
、例えば、
\(N = 12である\)
\(= 2 2 ^ 1 \ )
\(= 3 3 ^ 1 \)
\(= 2 4 ^ 2 \)
\(= 5 ^ 1 \)
\(= 2 ^ 1 * 3 6 ^ 1 \)
= 7 \(7 ^ 1 \)
\(8 = 2 ^ 3 \)
\(9 = 3 ^ 2 \)
\(10 = 2 ^ 1 * 5 ^ 1 \)
\(11 = 11 ^ 1 \)
\(12 = 2 ^ 2 * 3 ^ 1 \)

デジタル 多数の
2 10
3 5
5 2
7 1
11 1

\(\ mathcal {レゾルベント} \)

合成数のための\(X \)有していて\(X = P ^ {A_1 } _1 * P ^ {A_2} _2 * ... * P ^ {A_N} _n \)

\(O(N \ SQRT N)\)

これは、最初のレコードの数が素数である最もシンプルなアイデア、そしてある\(N \)壊れすべての数値の範囲内

int cnt;
int prime[maxn],num[maxn];//prime -> 求出来的质数   num -> 每个数出现个数
bool vis[maxn];//欧拉筛里看其是否是质数
ols(n);//这是欧拉筛
for (int i=1;i<=n;++i)
    for (int j=1;j*j<=i&&j<=cnt;++j){
        int t=i;
        while (t%prime[j]==0)   ++num[prime[j]],t/=prime[j];
    }

\(O(nlog_2n)\)

全体的な需要を考慮することを指示することができ
、この方法は、他の質問の数のために有用です

int cnt;
int prime[maxn],num[maxn];
bool vis[maxn];
ols(n);
for (int i=1;i<=cnt;++i){
    int t=prime[i],mi=1;//mi -> mi次幂
    while (t<=n){
        num[prime[i]]+=n/t*mi;
        t*=prime[i],++mi;
    }
}

\(O(n)\)

数の場合は\(X \)
\(X- / P_1 \)明確により\(X \)私たちが知っている場合、小さな、(X / P_1 \)\の答えを、その後、\(X \)の貢献をして(\しますX / P_1の\)と結合された拠出\(P_1 \)の貢献である
が、我々は(X / P_1を\ \)の答えは複雑さを増すだけ生き残る
我々はサイクル、回すことができるように\(X- \)を最初にし\(P_1 \) その後、我々はより多くの考えることができますプラスの貢献\(X / P_1 \)
の計算\(X / P_1 \)は答えが1以上になるとき、すべてのように、明らかに私たちは常に、一緒に渡すことができます数だけ貢献してそれらの最小品質係数を計算することができます

int cnt;
int prime[maxn],num[maxn],come[maxn];//come[i] -> i的最小质因子
bool vis[maxn];
ols(n);
for (int i=n;i>=2;--i){
    if (vis[i]){//如果是个合数
        num[come[i]]+=num[i];//最小质因子加上当前这个数要计算次数
        num[i/come[i]]+=num[i];//加上这个数需计算次数
        num[i]=0;//当前这个数没了
    }
}

おすすめ

転載: www.cnblogs.com/Morning-Glory/p/10961055.html