#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <set>
#include <map>
#include <string>
#include <queue>
#include <stack>
using namespace std;
typedef long long int LL;
typedef long double LD;
typedef vector<int> VI;
typedef vector<LL> VLL;
typedef vector<LD> VLD;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef vector<PII> VPII;
const int INF = 1000000001;
const LD EPS = 10e-9;
#define FOR(x, b, e) for(int x = b; x <= (e); ++x)
#define FORD(x, b, e) for(int x = b; x >= (e); --x)
#define REP(x, n) for(int x = 0; x < (n); ++x)
#define VAR(v, n) __typeof(n) v = (n)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(x) ((int)(x).size())
#define FORE(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
#define MP make_pair
#define PB push_back
#define ST first
#define ND second
#define abs(a) ((a)<0 ? -(a) : (a))
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
const int MAX_N = 1000005;
int n, k;
LL p;
int res[][4] =
{
{2, 0, 0, 0},
{4, 2, 0, 0},
{8, 16, 0, 0},
{16, 100, 4, 0},
{32, 616, 72, 0},
{64, 4024, 952, 0},
{128, 28512, 11680, 0},
{256, 219664, 142800, 160},
{512, 1831712, 1788896, 7680},
{1024, 16429152, 23252832, 233792},
{2048, 157552000, 315549312, 5898240}
};
int main()
{
ios_base::sync_with_stdio(0);
cin >> n >> k >> p;
if(n <= 1)
{
cout << 0 << endl;
return 0;
}
if(k == 1)
{
LL pow2 = 1;
for(int i = 1; i < n; ++i)
pow2 = (pow2 * 2) % p;
cout << pow2 << endl;
return 0;
}
int pow2 = 1, pow2exp = 0;
while(pow2 < n)
{
pow2 *= 2;
pow2exp++;
}
if(k > pow2exp)
{
cout << 0 << endl;
return 0;
}
cout << res[n-2][k-1] % p << endl;
return 0;
}
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 | #include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <set> #include <map> #include <string> #include <queue> #include <stack> using namespace std; typedef long long int LL; typedef long double LD; typedef vector<int> VI; typedef vector<LL> VLL; typedef vector<LD> VLD; typedef vector<string> VS; typedef pair<int, int> PII; typedef vector<PII> VPII; const int INF = 1000000001; const LD EPS = 10e-9; #define FOR(x, b, e) for(int x = b; x <= (e); ++x) #define FORD(x, b, e) for(int x = b; x >= (e); --x) #define REP(x, n) for(int x = 0; x < (n); ++x) #define VAR(v, n) __typeof(n) v = (n) #define ALL(c) (c).begin(), (c).end() #define SIZE(x) ((int)(x).size()) #define FORE(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define MP make_pair #define PB push_back #define ST first #define ND second #define abs(a) ((a)<0 ? -(a) : (a)) #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) const int MAX_N = 1000005; int n, k; LL p; int res[][4] = { {2, 0, 0, 0}, {4, 2, 0, 0}, {8, 16, 0, 0}, {16, 100, 4, 0}, {32, 616, 72, 0}, {64, 4024, 952, 0}, {128, 28512, 11680, 0}, {256, 219664, 142800, 160}, {512, 1831712, 1788896, 7680}, {1024, 16429152, 23252832, 233792}, {2048, 157552000, 315549312, 5898240} }; int main() { ios_base::sync_with_stdio(0); cin >> n >> k >> p; if(n <= 1) { cout << 0 << endl; return 0; } if(k == 1) { LL pow2 = 1; for(int i = 1; i < n; ++i) pow2 = (pow2 * 2) % p; cout << pow2 << endl; return 0; } int pow2 = 1, pow2exp = 0; while(pow2 < n) { pow2 *= 2; pow2exp++; } if(k > pow2exp) { cout << 0 << endl; return 0; } cout << res[n-2][k-1] % p << endl; return 0; } |
English