pdpd123

Untitled

Sep 15th, 2020
905
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<bits/stdc++.h>
  2. #define endl '\n'
  3. using namespace std;
  4.  
  5. int n, m, k, x;
  6.  
  7. int dp[(1 << 17) + 10][17];
  8.  
  9. signed main() {
  10.     ios_base::sync_with_stdio(0);
  11.     cin.tie(0);
  12.     cin >> n >> m >> k;
  13.     x = (2 << m);
  14.    
  15.     for(int msk=0;msk<x;msk++) dp[msk][0] = 1;
  16.     for(int i=0;i<n;i++) {
  17.         for(int j=0;j<m-1;j++) {
  18.             for(int msk=0;msk<x;msk++) {
  19.                 int a = ((msk & (1 << j)) > 0);
  20.                 int b = ((msk & (2 << j)) > 0);
  21.                 int c = ((msk & (4 << j)) > 0);
  22.                 if(a + b + c + 1 >= 2) {
  23.                     dp[msk | (2 << j)][j+1] += dp[msk][j];
  24.                     if(dp[msk | (2 << j)][j+1] >= k) dp[msk | (2 << j)][j+1] -= k;
  25.                 }
  26.                 if(a + b + c >= 2) {
  27.                     dp[(msk | (2 << j)) - (2 << j)][j+1] += dp[msk][j];
  28.                     if(dp[(msk | (2 << j)) - (2 << j)][j+1] >= k) dp[(msk | (2 << j)) - (2 << j)][j+1] -= k;
  29.                 }
  30.             }
  31.         }
  32.         if(i == n-1) break;
  33.         for(int msk=0;msk<x;msk++) dp[msk][0] = 0;
  34.         for(int msk=0;msk<x;msk++) {
  35.             int newmsk = ((msk << 1) | (2 << m)) - (2 << m);
  36.             dp[newmsk][0] += dp[msk][m-1];
  37.             if(dp[newmsk][0] >= k) dp[newmsk][0] -= k;
  38.             dp[newmsk|1][0] += dp[msk][m-1];
  39.             if(dp[newmsk|1][0] >= k) dp[newmsk|1][0] -= k;
  40.         }
  41.         for(int j=1;j<m;j++) for(int msk=0;msk<x;msk++) dp[msk][j] = 0;
  42.     }
  43.  
  44.     int ans = 0;
  45.     for(int msk=0;msk<x;msk+=2) {
  46.         ans += dp[msk][0];
  47.         if(ans >= k) ans -= k;
  48.     }
  49.     cout << ans << endl;
  50. }
RAW Paste Data