Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool pr[100010];
- int resh[100010];
- void run() {
- int n, x, h;
- cin >> n >> x; h = 2;
- int block = int(sqrt(n)) + 10;
- vector <int> v;
- for (int i = 2; i < block; i++) {
- if (!resh[i]) {
- v.push_back(i);
- resh[i] = i;
- }
- for (auto& p : v) {
- if (p * i >= block || p > resh[i])
- break;
- resh[i * p] = p;
- }
- }
- v.erase(v.begin());
- for (int num = 0; num <= n; num += block << 1) {
- int mn = min(block, (n - num + 1) >> 1);
- fill(pr, pr + block, false);
- for (auto& p : v) {
- int f = num - num % p;
- f += p * (f < num);
- f += p * (f % 2 == 0);
- for (int i = (f - num) >> 1; i < mn; i += p)
- if (num + (i << 1) + 1 > p)
- pr[i] = true;
- }
- for (int i = 0; i < mn; i++)
- if ((num | i) && !pr[i])
- h = h * x + num + (i << 1) + 1;
- }
- cout << (n >= 2) * h << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement