Submission
Status:
PPPPPPPPPP
Subtask/Task Score:
100/100
Score: 100
User: Dormon
Problemset: จำนวนเฉพาะ (2560)
Language: cpp
Time: 0.004 second
Submitted On: 2025-07-04 00:11:20
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
class big_num {
private:
string plus(const string &lhs, const string &rhs){
int i = lhs.size() - 1, j = rhs.size() - 1, carry = 0; string ans = "";
while (i >= 0 || j >= 0 || carry){
int sum = ((i >= 0)? lhs[i--]-'0':0) + ((j >= 0)? rhs[j--]-'0':0) + carry;
ans += (sum % 10) + '0', carry = sum / 10;
}
reverse(ans.begin(), ans.end()); return ans;
}
string minus(const string &lhs, const string &rhs){ // lhs >= rhs
int i = lhs.size() - 1, j = rhs.size() - 1, borrow = 0; string ans = "";
while (i >= 0){
int x = lhs[i--] - '0' - borrow, y = (j >= 0 ? rhs[j--] - '0' : 0);
if (x < y) x += 10, borrow = 1;
else borrow = 0;
ans += (x - y) + '0';
}
while (ans.size() > 1 && ans.back() == '0') ans.pop_back();
reverse(ans.begin(), ans.end()); return ans;
}
string mul(const string &lhs, const string &rhs){ // can use fft for O(n log n)
int n = lhs.size(), m = rhs.size(); vector<int> v(n + m, 0);
for (int i = n - 1;i >= 0;i--) for (int j = m - 1;j >= 0;j--){
int mul = (lhs[i] - '0') * (rhs[j] - '0'), sum = v[i + j + 1] + mul;
v[i + j + 1] = sum % 10, v[i + j] += sum / 10;
}
string ans = ""; for (auto x:v) if (!ans.empty() || x) ans += x + '0';
return ans.empty()?"0":ans;
}
string div(const string &lhs, const string &rhs){
string ans = "", cur = "";
for (char c:lhs){
cur += c;
while (cur.size() > 1 && cur[0] == '0') cur.erase(cur.begin());
int cnt = 0;
while (cur.size() > rhs.size() || (cur.size() == rhs.size() && cur >= rhs)) cur = minus(cur, rhs), cnt++;
ans += cnt + '0';
}
while (ans.size() > 1 && ans[0] == '0') ans.erase(ans.begin());
return ans.empty()?"0":ans;
}
string mod(const string &lhs, const string &rhs){
string cur = "";
for (char c : lhs){
cur += c;
while (cur.size() > 1 && cur[0] == '0') cur.erase(cur.begin());
while (cur.size() > rhs.size() || (cur.size() == rhs.size() && cur >= rhs)) cur = minus(cur, rhs);
}
return cur.empty()?"0":cur;
}
public:
string num;
big_num() : num("0") {}
big_num(string s){
num = s;
while (num.size() > 1 && num[0] == '0') num.erase(num.begin());
}
big_num(int s) : big_num(to_string(s)) {}
big_num(long long s) : big_num(to_string(s)) {}
big_num &operator += (const big_num &rhs){num = plus(num, rhs.num); return *this;}
big_num &operator -= (const big_num &rhs){num = minus(num, rhs.num); return *this;}
big_num &operator *= (const big_num &rhs){num = mul(num, rhs.num); return *this;}
big_num &operator /= (const big_num &rhs){num = div(num, rhs.num); return *this;}
big_num &operator %= (const big_num &rhs){num = mod(num, rhs.num); return *this;}
friend big_num operator + (big_num lhs, const big_num &rhs){return lhs += rhs;}
friend big_num operator - (big_num lhs, const big_num &rhs){return lhs -= rhs;}
friend big_num operator * (big_num lhs, const big_num &rhs){return lhs *= rhs;}
friend big_num operator / (big_num lhs, const big_num &rhs){return lhs /= rhs;}
friend big_num operator % (big_num lhs, const big_num &rhs){return lhs %= rhs;}
friend istream &operator >> (istream &in, big_num &o){string s; in >> s;o.num = s; return in;}
friend ostream &operator << (ostream &out, const big_num &o){out << o.num; return out;}
friend bool operator == (const big_num &lhs, const big_num &rhs){return lhs.num == rhs.num;}
friend bool operator != (const big_num &lhs, const big_num &rhs){return lhs.num != rhs.num;}
friend bool operator < (const big_num &lhs, const big_num &rhs){if(lhs.num.size() != rhs.num.size())return lhs.num.size()<rhs.num.size();return lhs.num<rhs.num;}
friend bool operator <= (const big_num &lhs, const big_num &rhs){if(lhs.num.size() != rhs.num.size())return lhs.num.size()<=rhs.num.size();return lhs.num<=rhs.num;}
};
bool is_prime(big_num n){
for (big_num i(2);i * i <= n;i += big_num(1)) if (n % i == big_num(0)) return false;
return true;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
big_num n;
cin >> n;
for (big_num i(2);i < n;i += big_num(1))
if (is_prime(i))
cout << i << '\n';
}