// template taken from Striver_79
// Remember you were also a novice when you started
// hence never be rude to anyone who wants to learn something
// Never open a ranklist untill and unless you are done with solving problems, wastes 3/4 minuts
// Donot treat CP as a placement thing, love it and enjoy it, you will succeed for sure.
// The goal is to solve problems most efficiently not just barely
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
using namespace __gnu_pbds;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
const int mod = 1e9 + 7;
#define int long long
typedef long long ll;
typedef vector<ll> vi;
typedef vector<vector<int>> vii;
typedef vector<pair<int, int>> vpi;
typedef pair<int, int> pi;
void myerase(ordered_set &t, int v)
{
int rank = t.order_of_key(v); // Number of elements that are less than v in t
ordered_set::iterator it = t.find_by_order(rank); // Iterator that points to the (rank+1)th element in t
t.erase(it);
}
int power(long long x, unsigned int y, int p = 1e9 + 7)
{
int res = 1; // Initialize result
x = x % p; // Update x if it is more than or
// equal to p
if (x == 0)
return 0; // In case x is divisible by p;
while (y > 0)
{
// If y is odd, multiply x with result
if (y & 1)
res = (res * x) % p;
// y must be even now
y = y >> 1; // y = y/2
x = (x * x) % p;
}
return res;
}
// C function for extended Euclidean Algorithm (used to
// find modular inverse.
int gcdExtended(int a, int b, int *x, int *y)
{
// Base Case
if (a == 0)
{
*x = 0, *y = 1;
return b;
}
int x1, y1; // To store results of recursive call
int gcd = gcdExtended(b % a, a, &x1, &y1);
// Update x and y using results of recursive
// call
*x = y1 - (b / a) * x1;
*y = x1;
return gcd;
}
int modInverse(int b, int m)
{
int x, y; // used in extended GCD algorithm
int g = gcdExtended(b, m, &x, &y);
// Return -1 if b and m are not co-prime
if (g != 1)
return -1;
// m is added to handle negative x
return (x % m + m) % m;
}
// Function to compute a/b under modulo m
int modDivide(int a, int b, int m)
{
a = a % m;
int inv = modInverse(b, m);
if (inv == -1)
return -1;
else
return (inv * a) % m;
}
ll accurateFloor(ll a, ll b)
{
ll val = a / b;
while (val * b > a)
val--;
return val;
}
int eulerTotient(int n)
{
int val = n;
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
{
val = val - val / i;
while (n % i == 0)
{
n = n / i;
}
}
}
if (n > 1)
{
val = val - val / n;
}
return val;
}
void solve()
{
// Do not get stuck on a single approach for long, think of multiple ways
ll n;
cin >> n;
ll k;
cin >> k;
if (n <= 5)
{
int v = power(2, n);
int v2 = power(2, v, k);
cout << (v2 + 1) % k << "\n";
return;
}
int val1 = eulerTotient(k);
int val = power(2, n, val1);
int ans = power(2, val + val1, k);
cout << (ans + 1) % k << "\n";
}
int32_t main()
{
// hamare saath shree raghunath to kisi baat ki chinta nahi
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t = 1;
while (t--)
{
solve();
}
return 0;
}
Ly8gdGVtcGxhdGUgdGFrZW4gZnJvbSBTdHJpdmVyXzc5Ci8vIFJlbWVtYmVyIHlvdSB3ZXJlIGFsc28gYSBub3ZpY2Ugd2hlbiB5b3Ugc3RhcnRlZAovLyBoZW5jZSBuZXZlciBiZSBydWRlIHRvIGFueW9uZSB3aG8gd2FudHMgdG8gbGVhcm4gc29tZXRoaW5nCi8vIE5ldmVyIG9wZW4gYSByYW5rbGlzdCB1bnRpbGwgYW5kIHVubGVzcyB5b3UgYXJlIGRvbmUgd2l0aCBzb2x2aW5nIHByb2JsZW1zLCB3YXN0ZXMgMy80IG1pbnV0cwovLyBEb25vdCB0cmVhdCBDUCBhcyBhIHBsYWNlbWVudCB0aGluZywgbG92ZSBpdCBhbmQgZW5qb3kgaXQsIHlvdSB3aWxsIHN1Y2NlZWQgZm9yIHN1cmUuCi8vIFRoZSBnb2FsIGlzIHRvIHNvbHZlIHByb2JsZW1zIG1vc3QgZWZmaWNpZW50bHkgbm90IGp1c3QgYmFyZWx5CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojaW5jbHVkZSA8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+CiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBfX2dudV9wYmRzOwp0eXBlZGVmIHRyZWU8aW50LCBudWxsX3R5cGUsIGxlc3NfZXF1YWw8aW50PiwgcmJfdHJlZV90YWcsIHRyZWVfb3JkZXJfc3RhdGlzdGljc19ub2RlX3VwZGF0ZT4gb3JkZXJlZF9zZXQ7CmNvbnN0IGludCBtb2QgPSAxZTkgKyA3OwojZGVmaW5lIGludCBsb25nIGxvbmcKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdmVjdG9yPGxsPiB2aTsKdHlwZWRlZiB2ZWN0b3I8dmVjdG9yPGludD4+IHZpaTsKdHlwZWRlZiB2ZWN0b3I8cGFpcjxpbnQsIGludD4+IHZwaTsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBwaTsKdm9pZCBteWVyYXNlKG9yZGVyZWRfc2V0ICZ0LCBpbnQgdikKewogICAgaW50IHJhbmsgPSB0Lm9yZGVyX29mX2tleSh2KTsgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIHYgaW4gdAogICAgb3JkZXJlZF9zZXQ6Oml0ZXJhdG9yIGl0ID0gdC5maW5kX2J5X29yZGVyKHJhbmspOyAvLyBJdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgKHJhbmsrMSl0aCBlbGVtZW50IGluIHQKICAgIHQuZXJhc2UoaXQpOwp9CmludCBwb3dlcihsb25nIGxvbmcgeCwgdW5zaWduZWQgaW50IHksIGludCBwID0gMWU5ICsgNykKewogICAgaW50IHJlcyA9IDE7IC8vIEluaXRpYWxpemUgcmVzdWx0CgogICAgeCA9IHggJSBwOyAvLyBVcGRhdGUgeCBpZiBpdCBpcyBtb3JlIHRoYW4gb3IKICAgICAgICAgICAgICAgLy8gZXF1YWwgdG8gcAoKICAgIGlmICh4ID09IDApCiAgICAgICAgcmV0dXJuIDA7IC8vIEluIGNhc2UgeCBpcyBkaXZpc2libGUgYnkgcDsKCiAgICB3aGlsZSAoeSA+IDApCiAgICB7CiAgICAgICAgLy8gSWYgeSBpcyBvZGQsIG11bHRpcGx5IHggd2l0aCByZXN1bHQKICAgICAgICBpZiAoeSAmIDEpCiAgICAgICAgICAgIHJlcyA9IChyZXMgKiB4KSAlIHA7CgogICAgICAgIC8vIHkgbXVzdCBiZSBldmVuIG5vdwogICAgICAgIHkgPSB5ID4+IDE7IC8vIHkgPSB5LzIKICAgICAgICB4ID0gKHggKiB4KSAlIHA7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9CgovLyBDIGZ1bmN0aW9uIGZvciBleHRlbmRlZCBFdWNsaWRlYW4gQWxnb3JpdGhtICh1c2VkIHRvCi8vIGZpbmQgbW9kdWxhciBpbnZlcnNlLgppbnQgZ2NkRXh0ZW5kZWQoaW50IGEsIGludCBiLCBpbnQgKngsIGludCAqeSkKewogICAgLy8gQmFzZSBDYXNlCiAgICBpZiAoYSA9PSAwKQogICAgewogICAgICAgICp4ID0gMCwgKnkgPSAxOwogICAgICAgIHJldHVybiBiOwogICAgfQoKICAgIGludCB4MSwgeTE7IC8vIFRvIHN0b3JlIHJlc3VsdHMgb2YgcmVjdXJzaXZlIGNhbGwKICAgIGludCBnY2QgPSBnY2RFeHRlbmRlZChiICUgYSwgYSwgJngxLCAmeTEpOwoKICAgIC8vIFVwZGF0ZSB4IGFuZCB5IHVzaW5nIHJlc3VsdHMgb2YgcmVjdXJzaXZlCiAgICAvLyBjYWxsCiAgICAqeCA9IHkxIC0gKGIgLyBhKSAqIHgxOwogICAgKnkgPSB4MTsKCiAgICByZXR1cm4gZ2NkOwp9CgppbnQgbW9kSW52ZXJzZShpbnQgYiwgaW50IG0pCnsKICAgIGludCB4LCB5OyAvLyB1c2VkIGluIGV4dGVuZGVkIEdDRCBhbGdvcml0aG0KICAgIGludCBnID0gZ2NkRXh0ZW5kZWQoYiwgbSwgJngsICZ5KTsKCiAgICAvLyBSZXR1cm4gLTEgaWYgYiBhbmQgbSBhcmUgbm90IGNvLXByaW1lCiAgICBpZiAoZyAhPSAxKQogICAgICAgIHJldHVybiAtMTsKCiAgICAvLyBtIGlzIGFkZGVkIHRvIGhhbmRsZSBuZWdhdGl2ZSB4CiAgICByZXR1cm4gKHggJSBtICsgbSkgJSBtOwp9CgovLyBGdW5jdGlvbiB0byBjb21wdXRlIGEvYiB1bmRlciBtb2R1bG8gbQppbnQgbW9kRGl2aWRlKGludCBhLCBpbnQgYiwgaW50IG0pCnsKICAgIGEgPSBhICUgbTsKICAgIGludCBpbnYgPSBtb2RJbnZlcnNlKGIsIG0pOwogICAgaWYgKGludiA9PSAtMSkKICAgICAgICByZXR1cm4gLTE7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIChpbnYgKiBhKSAlIG07Cn0KbGwgYWNjdXJhdGVGbG9vcihsbCBhLCBsbCBiKQp7CiAgICBsbCB2YWwgPSBhIC8gYjsKICAgIHdoaWxlICh2YWwgKiBiID4gYSkKICAgICAgICB2YWwtLTsKICAgIHJldHVybiB2YWw7Cn0KaW50IGV1bGVyVG90aWVudChpbnQgbikKewogICAgaW50IHZhbCA9IG47CiAgICBmb3IgKGludCBpID0gMjsgaSAqIGkgPD0gbjsgaSsrKQogICAgewogICAgICAgIGlmIChuICUgaSA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgdmFsID0gdmFsIC0gdmFsIC8gaTsKICAgICAgICAgICAgd2hpbGUgKG4gJSBpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG4gPSBuIC8gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmIChuID4gMSkKICAgIHsKICAgICAgICB2YWwgPSB2YWwgLSB2YWwgLyBuOwogICAgfQogICAgcmV0dXJuIHZhbDsKfQp2b2lkIHNvbHZlKCkKewogICAgLy8gRG8gbm90IGdldCBzdHVjayBvbiBhIHNpbmdsZSBhcHByb2FjaCBmb3IgbG9uZywgdGhpbmsgb2YgbXVsdGlwbGUgd2F5cwogICAgbGwgbjsKICAgIGNpbiA+PiBuOwogICAgbGwgazsKICAgIGNpbiA+PiBrOwogICAgaWYgKG4gPD0gNSkKICAgIHsKICAgICAgICBpbnQgdiA9IHBvd2VyKDIsIG4pOwogICAgICAgIGludCB2MiA9IHBvd2VyKDIsIHYsIGspOwogICAgICAgIGNvdXQgPDwgKHYyICsgMSkgJSBrIDw8ICJcbiI7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IHZhbDEgPSBldWxlclRvdGllbnQoayk7CiAgICBpbnQgdmFsID0gcG93ZXIoMiwgbiwgdmFsMSk7CiAgICBpbnQgYW5zID0gcG93ZXIoMiwgdmFsICsgdmFsMSwgayk7CiAgICBjb3V0IDw8IChhbnMgKyAxKSAlIGsgPDwgIlxuIjsKfQppbnQzMl90IG1haW4oKQp7CiAgICAvLyBoYW1hcmUgc2FhdGggc2hyZWUgcmFnaHVuYXRoIHRvIGtpc2kgYmFhdCBraSBjaGludGEgbmFoaQogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwogICAgaW50IHQgPSAxOwogICAgd2hpbGUgKHQtLSkKICAgIHsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=