1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #include <bits/stdc++.h> #define eb emplace_back using namespace std; using ll = long long; mt19937_64 mt(random_device{}()); int N = 240000000; bool vis[240000000 + 1]; ll prime[28638900]; int cnt;
ll n; void init() { vis[1] = 1; for (int i = 2; i <= N; ++i) { if (!vis[i]) { prime[++cnt] = i; } for (int j = 1; j <= cnt && prime[j] * i <= N; ++j) { vis[prime[j] * i] = 1; if (i % prime[j] == 0) break; } } for (int i = 1; i <= cnt; ++i) prime[i] += prime[i - 1]; } inline ll qp(__int128 x, ll y, ll p) { if (y == 0) return 1; x %= p; __int128 ans = 1; while (y) { if (y & 1) ans = ans * x % p; y >>= 1; x = x * x % p; } return ans; } inline bool pzs(const ll& nn) { if(nn==2)return 1; if(nn<2||!(nn&1))return 0; if (nn <= N) return !vis[nn];
ll zs = nn - 1, v; int t = 0; while (zs % 2 == 0) zs >>= 1, ++t; for (int i = 0; i < 1; ++i) { ll bs = mt() % (nn - 2) + 2; v = qp(bs, zs, nn); if (v == 1) continue;; int j; for (j = 0; j < t; ++j) { if (v == nn - 1) break; v = (__int128) v * v % nn; } if (j == t) return 0; } return 1; } ll js(ll l, ll r) { ll sum=0; for(ll i=l;i<=r;++i) { if(pzs(i))sum+=i; if(sum>1e11) return (ll)(1e11) + 1; } return sum; } deque <ll> a; int main() { freopen("prime.in", "r", stdin); freopen("prime.out", "w", stdout); scanf("%lld", &n); N = max(min((ll)N, n), 100ll);
init(); int l, r = lower_bound(prime, prime + cnt + 1, n) - prime; for (int i = r; i <= cnt; ++i) { l = lower_bound(prime, prime + cnt + 1, prime[i] - n) - prime; if (prime[i] - prime[l] == n) { printf("%lld %lld", prime[l + 1] - prime[l], prime[i] - prime[i - 1]); return 0; } } if (prime[cnt] - prime[cnt - 1] > n) { puts("NIE"); return 0; } if (pzs(n)) { printf("%lld %lld", n, n); return 0; } for (ll i = 2; i <= n / (prime[cnt] - prime[cnt - 1]); ++i) { a.clear(); for (ll j = n / i, jj = 0; j < n && jj < i; ++j) { if (pzs(j)) ++jj, a.eb(j); } for (ll j = n/i - 1, jj = 0; j && jj < i; --j) { if (pzs(j)) ++jj, a.emplace_front(j); }
a.emplace_front(0); for (int ii = 1; ii < a.size(); ++ii) a[ii] += a[ii - 1]; int l = 1, r = 1; for (r = 1; r < a.size(); ++r) { while (l <= r && a[r] - a[l - 1] > n) ++l; if (a[r] - a[l - 1] == n) { printf("%lld %lld", a[l] - a[l - 1], a[r] - a[r - 1]); return 0; } } } puts("NIE"); return 0; }
|