Advertisement
Guest User

parcare1 fain

a guest
Apr 25th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream in("parcare1.in");
  6. ofstream out("parcare1.out");
  7.  
  8. #define STATE pair<int,bool>
  9.  
  10. const int NMAX = 20;
  11. const int MOD  = 666013;
  12.  
  13. typedef long long I64;
  14.  
  15. STATE dp[NMAX+2][NMAX+2][NMAX+2][NMAX+2];
  16. STATE aux[NMAX+2][NMAX+2][NMAX+2][NMAX+2];
  17. STATE coloana[NMAX+2][NMAX+2];
  18.  
  19. int N, H, Q;
  20.  
  21. inline void add(STATE &a, STATE b)
  22. {
  23.     if( b.second == 0 ) return ;
  24.  
  25.     a.second = 1;
  26.     a.first = (a.first + b.first) % MOD;
  27. }
  28.  
  29. STATE mult(STATE s, int x)
  30. {
  31.     if( s.second == 0 ) return s;
  32.  
  33.     s.first = 1LL * s.first * x % MOD;
  34.  
  35.     return s;
  36. }
  37.  
  38. int main()
  39. {
  40.     in >> N >> H >> Q;
  41.     dp[0][0][0][0] = {1, 1};
  42.     for( int ind = 1;  ind <= N;  ++ind ) {
  43.         int g;
  44.         in >> g;
  45.         for( int i = 0;  i <= NMAX;  ++i ) for( int x = 0;  x <= NMAX;  ++x )
  46.         for( int j = 0;  j <= NMAX;  ++j ) for( int y = 0;  y <= NMAX;  ++y )
  47.             aux[i][x][j][y] = dp[i][x][j][y];
  48.         for( int i = 0;  i <= NMAX;  ++i ) for( int x = 0;  x <= NMAX;  ++x )
  49.         for( int j = 0;  j <= NMAX;  ++j ) for( int y = 0;  y <= NMAX;  ++y ) {
  50.             dp[i][x][j][y] = aux[i][x][j][y];
  51.             if( i >= g && x > 0 )
  52.                 add(dp[i][x][j][y], mult(aux[i - g][x - 1][j][y], x));
  53.             if( j >= g && y > 0 )
  54.                 add(dp[i][x][j][y], mult(aux[i][x][j - g][y - 1], y));
  55.         }
  56.     }
  57.     for( int i = 0;  i <= NMAX;  ++i ) for( int x = 0;  x <= NMAX;  ++x )
  58.     for( int j = 0;  j <= NMAX;  ++j ) for( int y = 0;  y <= NMAX;  ++y )
  59.         add(coloana[i][j], dp[i][x][j][y]);
  60.     I64 ans = 1;
  61.     for( int i = 1;  i <= Q;  ++i ) {
  62.         int pos;
  63.         in >> pos;
  64.         if( coloana[pos - 1][H - pos].second == 0 ) {
  65.             ans = 0;
  66.             break;
  67.         }
  68.         ans = 1LL * ans * coloana[pos - 1][H - pos].first % MOD;
  69.     }
  70.     out << ans << '\n';
  71.     return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement