オイラーの機能:リニアふるい(テンプレート)

ショックを受けました!OIer実際に使用(O(N ^ 2)\ \) 1年にふるいアップ!
元の画面と画面には、オイラー関数類似素数、エッペンドルフふるいを、Aふるい...線形であります

リニア画面を実現するには、最初にオイラー関数の性質をクリアする必要があります。
設定\(P \)素数である、そこ

  • \(\ varphi(P)= P-1 \)
  • \(P iとプライム、その後、\ varphi(I * P)= \ varphi(I)*(P-1)の場合\)
  • \(IとPが素数でない場合、\ varphi(I * P)= \ varphi(I)* P \)

コードは以下の通りであります:

void get_phi(long long n) {
    p[1] = 1;
    for(long long i = 2; i <= n; i++) {
        if(!flag[i]) {
            prime[++cnt] = i;
            p[i] = i-1;
        }
        for(long long j = 1; j <= cnt && i*prime[j] <= n; j++) {
            flag[i*prime[j]] = true;
            if(i%prime[j])
                p[i*prime[j]] = p[i]*(prime[j]-1);
            else {
                p[i*prime[j]] = p[i]*prime[j];
                break;
            }
        }
    }
}

おすすめ

転載: www.cnblogs.com/mogeko/p/12508006.html