cpp_library

This documentation is automatically generated by online-judge-tools/verification-helper

This project is maintained by tsutaj

:warning: math/math_002_prime.cpp

Code

// エラトステネスの篩

// [0,n) の範囲の i について、primes[i] != 0 ⇔ i は素数

vector<int> erat(int n) {
    vector<int> primes(n);
    for (int i = 2; i < n; ++i) primes[i] = i;
    for (int i = 2; i*i < n; ++i)
        if (primes[i])
            for (int j = i*i; j < n; j+=i) primes[j] = 0;
    // 素数のみをvectorに格納する場合は以下の行を追加 (0 である要素を全削除)

    // primes.erase(remove(primes.begin(), primes.end(), 0), primes.end());

    return primes;
}

// 素数判定

bool isprime(int n) { //素数ならばtrue

    for(int i=2; i*i <= n; i++) {
        if(n%i==0) return false;
    }
    return n != 1;
}

// 素因数分解

vector<int> primeFactorization(int n) {
    int k = n;
    vector<int> ret;
    repq(i,2,sqrt(n)) {
        while(k % i == 0) {
            ret.pb(i);
            k /= i; // 重複を許さないならここを while に

        }
    }
    if(k > 1) ret.pb(k);
    return ret;
}

// ガウス素数判定

// ※複素整数(実部も虚部も整数の複素数) a + bi がガウス素数であるとは、

// これを割り切る非自明な複素整数が存在しないことを言う。


// 例: 5は素数だがガウス素数ではない ( 5 = (2+i)(2-i) )

bool isGaussianprime(Int a, Int b) {
  if (a < 0) a = -a;
  if (b < 0) b = -b;
  if (a == 0) return b % 4 == 3 && isprime(b);
  if (b == 0) return a % 4 == 3 && isprime(a);
  return isprime(a*a+b*b);
}

// 素数表の作成 (nまでの素数を配列vに格納)

int main() {
    int n;
    vector<int> v;

    cin >> n;
    v.pb(2);
    for(int i=3;i<=n;i+=2) {
        bool add = true;
        rep(j,0,v.size()) {
            if(v[j] * v[j] > i) break;
            if(i % v[j] == 0) {
                add = false;
                break;
            }
        }
        if(add) v.pb(i);
    }

    //rep(i,0,v.size()) cout << v[i] << endl;

    return 0;
}

// 約数全列挙

vector<ll> OutDivisor(ll n) {
    vector<ll> ret;
    for(ll i=1; i*i<=n; i++) {
        if(n % i == 0) {
            ret.push_back(i);
            if(i*i!=n) ret.push_back(n / i);
        }
    }
    return ret;
}
#line 1 "math/math_002_prime.cpp"
// エラトステネスの篩

// [0,n) の範囲の i について、primes[i] != 0 ⇔ i は素数

vector<int> erat(int n) {
    vector<int> primes(n);
    for (int i = 2; i < n; ++i) primes[i] = i;
    for (int i = 2; i*i < n; ++i)
        if (primes[i])
            for (int j = i*i; j < n; j+=i) primes[j] = 0;
    // 素数のみをvectorに格納する場合は以下の行を追加 (0 である要素を全削除)

    // primes.erase(remove(primes.begin(), primes.end(), 0), primes.end());

    return primes;
}

// 素数判定

bool isprime(int n) { //素数ならばtrue

    for(int i=2; i*i <= n; i++) {
        if(n%i==0) return false;
    }
    return n != 1;
}

// 素因数分解

vector<int> primeFactorization(int n) {
    int k = n;
    vector<int> ret;
    repq(i,2,sqrt(n)) {
        while(k % i == 0) {
            ret.pb(i);
            k /= i; // 重複を許さないならここを while に

        }
    }
    if(k > 1) ret.pb(k);
    return ret;
}

// ガウス素数判定

// ※複素整数(実部も虚部も整数の複素数) a + bi がガウス素数であるとは、

// これを割り切る非自明な複素整数が存在しないことを言う。


// 例: 5は素数だがガウス素数ではない ( 5 = (2+i)(2-i) )

bool isGaussianprime(Int a, Int b) {
  if (a < 0) a = -a;
  if (b < 0) b = -b;
  if (a == 0) return b % 4 == 3 && isprime(b);
  if (b == 0) return a % 4 == 3 && isprime(a);
  return isprime(a*a+b*b);
}

// 素数表の作成 (nまでの素数を配列vに格納)

int main() {
    int n;
    vector<int> v;

    cin >> n;
    v.pb(2);
    for(int i=3;i<=n;i+=2) {
        bool add = true;
        rep(j,0,v.size()) {
            if(v[j] * v[j] > i) break;
            if(i % v[j] == 0) {
                add = false;
                break;
            }
        }
        if(add) v.pb(i);
    }

    //rep(i,0,v.size()) cout << v[i] << endl;

    return 0;
}

// 約数全列挙

vector<ll> OutDivisor(ll n) {
    vector<ll> ret;
    for(ll i=1; i*i<=n; i++) {
        if(n % i == 0) {
            ret.push_back(i);
            if(i*i!=n) ret.push_back(n / i);
        }
    }
    return ret;
}
Back to top page