Cod sursa(job #2053833)

Utilizator mlc_oficialBoris Barca mlc_oficial Data 1 noiembrie 2017 14:10:35
Problema Ciurul lui Eratosthenes Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
#include <iostream>
#include <fstream>

using namespace std;

template <typename T>
struct ExactDiv {
  ExactDiv() {}
  ExactDiv(T n) : t(T(-1) / n), i(mul_inv(n)) {}
  T mul_inv(T n) {
    T x = n;
    for (int i = 0; i < 5; ++i) x *= 2 - n * x;
    return x;
  }
  friend T operator / (T n, ExactDiv d) { return n * d.i; };
  bool divide(T n) { return n * this->i <= this->t; }
  T t, i;
};

constexpr int kSqrtMax = 1415;

ExactDiv<uint32_t> division[kSqrtMax];

bool IsPrime(int n) {
    for (int i = 3; i * i <= n; i += 2) {
        if (division[i].divide(n)) {
            return false;
        }
    }    
    return true;
}

int main() {
    #ifdef INFOARENA
    ifstream cin("ciur.in");
    ofstream cout("ciur.out");
    #endif
    
    for (int i = 3; i < kSqrtMax; i += 2) {
        division[i] = ExactDiv<uint32_t>((uint32_t)i);
    }
    
    int n; cin >> n;
    int answer = 1;
    for (int i = 3; i <= n; i += 2) {
        if (IsPrime(i)) {
            answer += 1;
        }
    }
    cout << answer << endl;
}