Advertisement
trungore10

code_multchoice

Dec 10th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. /// solution : https://pastebin.com/1UWbv6PT
  2. #include<bits/stdc++.h>
  3. #define int             long long
  4. using namespace std;
  5.  
  6. const int N = 2004, MOD = 1e9 + 7;
  7. int n, P, Q, numAnswer[N];
  8. char a[N], b[N];
  9.  
  10. int Equal[N], Diff[N], numEqual, numDiff;
  11. int C[N][N];
  12.  
  13. void prepare() {
  14.     for (int i = 0; i <= n; ++i) for (int j = 0; j <= i; ++j)
  15.         C[i][j] = (j == 0 || j == i) ? 1 : (C[i-1][j] + C[i-1][j-1]) % MOD;
  16.  
  17.     for (int i = 1; i <= n; ++i) {
  18.         if (a[i] == b[i]) Equal[++numEqual] = i;
  19.         else Diff[++numDiff] = i;
  20.     }
  21. }
  22.  
  23. int dp[2][N][N];
  24.  
  25. int Mul(int a, int b, int c) { return ( (a * b) % MOD * c ) % MOD; }
  26.  
  27. void sol() {
  28.     prepare();
  29.  
  30.     dp[0][0][0] = 1;
  31.     for (int i = 1; i <= numEqual; ++i) for (int j = 0; j <= i; ++j)
  32.         dp[0][i][j] = ( dp[0][i-1][j] + (j > 0) * dp[0][i-1][j-1] * (numAnswer[Equal[i]]-1) ) % MOD;
  33.  
  34.     dp[1][0][0] = 1;
  35.     for (int i = 1; i <= numDiff; ++i) for (int j = 0; j <= i; ++j)
  36.         dp[1][i][j] = ( dp[1][i-1][j] + (j > 0) * dp[1][i-1][j-1] * (numAnswer[Diff[i]]-2) ) % MOD;
  37.  
  38.     int res = 0;
  39.     for (int i = 0; i <= numEqual; ++i) {
  40.         int j = numEqual - i;
  41.         int remain1 = P - j, remain2 = Q - j, sum = remain1 + remain2;
  42.         if (remain1 < 0 || remain2 < 0) continue;
  43.  
  44.         if (numDiff < remain1 + remain2) continue;
  45.         res += Mul( dp[0][numEqual][i], dp[1][numDiff][numDiff-sum], C[sum][remain1] );
  46.         res %= MOD;
  47.     }
  48.     cout << res << '\n';
  49. }
  50.  
  51. #undef int
  52. int main() {
  53. #define int             long long
  54.     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  55.     if (fopen("input.txt", "r")) {
  56.         freopen("input.txt", "r", stdin);
  57.     }
  58.     else if (fopen("multchoice.inp", "r")) {
  59.         freopen("multchoice.inp", "r", stdin);
  60.         freopen("multchoice.out", "w", stdout);
  61.     }
  62.    
  63.     cin >> n >> P >> Q;
  64.     for (int i = 1; i <= n; ++i) cin >> a[i];
  65.     for (int i = 1; i <= n; ++i) cin >> b[i];
  66.     for (int i = 1; i <= n; ++i) {
  67.         char c;
  68.         for (int j = 1; j <= 5; ++j) {
  69.             cin >> c;
  70.             if (c != '.') numAnswer[i]++;
  71.         }
  72.     }
  73.  
  74.     sol();
  75.  
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement