Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- using namespace std;
- const int N = 25, M = 1e3 + 5;
- ll n, m, p;
- ll dp[M][N / 2 + 1][1 << (N / 2)];
- ll modpow(ll a, ll b) {
- ll c = 1;
- while(b--) c = (c * a) % p;
- return c;
- }
- int main() {
- ios::sync_with_stdio(false);
- cin.tie(0);
- cin >> n >> m >> p;
- if(n % 2 == 1 && m % 2 == 1) {
- return cout << 1 << endl, 0;
- }else if(n % 2 == 1 && m % 2 == 0) {
- return cout << modpow(m/2 + 1, (n-1) / 2) << endl, 0;
- }else if(n % 2 == 0 && m % 2 == 1) {
- return cout << modpow(n/2 + 1, (m-1) / 2) << endl, 0;
- }
- n /= 2; m /= 2;
- int M = (1 << n);
- for(int i = 1; i <= m; i++) {
- for(int R = 0; R <= n; R++) {
- for(int mask = 0; mask < M; mask++) {
- if(i == 1) {
- dp[i][R][mask] = 1;
- continue;
- }
- int mask2 = mask;
- for(int r = R; r <= n; r++) {
- if(r - R >= 2 && ((mask >> (r - 1)) & 1)) {
- mask2 |= (1 << (r - 2));
- }
- (dp[i][R][mask] += dp[i - 1][r][mask2]) %= p;
- }
- mask2 = mask;
- for(int r = R - 1; r >= 0; r--) {
- if(R - r >= 2 && ((mask >> r) & 1)) {
- mask2 |= (1 << (r + 1));
- }
- (dp[i][R][mask] += dp[i - 1][r][mask2]) %= p;
- }
- }
- // sum over supersets
- for(int k = 0; k < n; k++) {
- for(int mask = M - 1; mask >= 0; mask--) {
- if(((mask >> k) & 1) == 0) {
- (dp[i][R][mask] += dp[i][R][mask + (1 << k)]) %= p;
- }
- }
- }
- }
- }
- ll sum = 0;
- for(int R = 0; R <= n; R++) (sum += dp[m][R][0]) %= p;
- cout << sum << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement