Advertisement
goshansmails

Untitled

Apr 5th, 2020
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. ll BIG_PRIME = 1000000007;
  10.  
  11. ll norm(ll d, ll MOD) {
  12.     return ((d % MOD) + MOD) % MOD;
  13. }
  14.  
  15. ll Madd (ll x, ll y, ll MOD) {
  16.     return norm (norm(x, MOD) + norm (y, MOD), MOD);
  17. }
  18.  
  19. ll Msub (ll x, ll y, ll MOD) {
  20.     return norm (norm(x, MOD) - norm (y, MOD), MOD);
  21. }
  22.  
  23. ll Mmul (ll x, ll y, ll MOD) {
  24.     return norm (norm(x, MOD) * norm (y, MOD), MOD);
  25. }
  26.  
  27. ll fastpow(ll a, ll n, ll MOD) {
  28.     if (n == 0LL) {
  29.         return 1LL;
  30.     }
  31.     if (n % 2 == 1) {
  32.         return (a * fastpow(a, n - 1, MOD)) % MOD;
  33.     }
  34.     ll tmp = fastpow(a, n / 2, MOD);
  35.     return (tmp * tmp) % MOD;
  36. }
  37.  
  38. ll Mdiv(ll a, ll b, ll PMOD) {
  39.     return Mmul(a, fastpow(b, PMOD - 2LL, PMOD), PMOD);
  40. }
  41.  
  42. unordered_map<ll, unordered_map<ll, unordered_map<ll, unordered_map<ll, ll>>>> dp;
  43. vector<ll> factorial;
  44. ll n = 0;
  45. vector<ll> a;
  46. ll total_cards;
  47. vector<ll> first_player_cards_of_type;
  48. vector<ll> second_player_cards_of_type;
  49.  
  50. ll permutations_first() {
  51.     ll numerator = factorial[total_cards / 2];
  52.     ll denominator = 1;
  53.     for (ll i = 1; i <= n; ++i) {
  54.         denominator = Mmul(denominator, factorial[first_player_cards_of_type[i]], BIG_PRIME);
  55.     }
  56.     return Mdiv(numerator, denominator, BIG_PRIME);
  57. }
  58.  
  59. ll permutations_second() {
  60.     ll numerator = factorial[total_cards / 2];
  61.     ll denominator = 1;
  62.     for (ll i = 1; i <= n; ++i) {
  63.         denominator = Mmul(denominator, factorial[second_player_cards_of_type[i]], BIG_PRIME);
  64.     }
  65.     return Mdiv(numerator, denominator, BIG_PRIME);
  66. }
  67.  
  68. ll total_permutations() {
  69.     ll numerator = factorial[total_cards];
  70.     ll denominator = 1;
  71.     for (ll i = 1; i <= n; ++i) {
  72.         denominator = Mmul(denominator, factorial[a[i]], BIG_PRIME);
  73.     }
  74.     return Mdiv(numerator, denominator, BIG_PRIME);
  75. }
  76.  
  77. ll f(ll idx, ll delta, ll first_player_total_cards, ll second_player_total_cards) {
  78.     if (idx > n) {
  79.         if (first_player_total_cards == second_player_total_cards &&
  80.             second_player_total_cards == total_cards / 2)
  81.         {
  82.             // Check delta is OK
  83.             ll real_delta = 0;
  84.             for (ll i = 1; i <= n; ++i) {
  85.                 if (first_player_cards_of_type[i] == a[i]) {
  86.                     ++real_delta;
  87.                 } else if (second_player_cards_of_type[i] == a[i]) {
  88.                     --real_delta;
  89.                 }
  90.             }
  91.             if (delta == real_delta) {
  92.                 return Mmul(permutations_first(), permutations_second(), BIG_PRIME);
  93.             }
  94.         }
  95.         return 0;
  96.     }
  97.  
  98.     if (first_player_total_cards > total_cards / 2 || second_player_total_cards > total_cards / 2) {
  99.         return 0;
  100.     }
  101.  
  102. /*
  103.     if (dp[n][delta][first_player_total_cards].count(second_player_total_cards) != 0) {
  104.         return dp[n][delta][first_player_total_cards][second_player_total_cards];
  105.     }
  106. */
  107.  
  108.     first_player_cards_of_type[idx] = a[idx];
  109.     second_player_cards_of_type[idx] = 0;
  110.     ll first_win = f(
  111.             idx + 1,
  112.             delta - 1,
  113.             first_player_total_cards + a[idx],
  114.             second_player_total_cards + 0
  115.     );
  116.  
  117.     first_player_cards_of_type[idx] = 0;
  118.     second_player_cards_of_type[idx] = a[idx];
  119.     ll first_lose = f(
  120.             idx + 1,
  121.             delta + 1,
  122.             first_player_total_cards + 0,
  123.             second_player_total_cards + a[idx]
  124.     );
  125.  
  126.     ll draw = 0;
  127.     for (ll i = 1; i < a[idx]; ++i) {
  128.         first_player_cards_of_type[idx] = i;
  129.         second_player_cards_of_type[idx] = a[idx] - i;
  130.         draw = Madd(
  131.                 draw,
  132.                 f(
  133.                         idx + 1,
  134.                         delta,
  135.                         first_player_total_cards + i,
  136.                         second_player_total_cards + (a[idx] - i)
  137.                 ),
  138.                 BIG_PRIME
  139.         );
  140.     }
  141.  
  142.     //dp[n][delta][first_player_total_cards][second_player_total_cards] = Madd(draw, Madd(first_win, first_lose, BIG_PRIME), BIG_PRIME);
  143.     //return dp[n][delta][first_player_total_cards][second_player_total_cards];
  144.     return Madd(draw, Madd(first_win, first_lose, BIG_PRIME), BIG_PRIME);
  145. }
  146.  
  147. int main() {
  148.     cin >> n;
  149.     a.resize(n + 1);
  150.     first_player_cards_of_type.resize(n + 1);
  151.     second_player_cards_of_type.resize(n + 1);
  152.     for (ll i = 1; i <= n; ++i) {
  153.         cin >> a[i];
  154.         total_cards += a[i];
  155.     }
  156.  
  157.     factorial.resize(501);
  158.     factorial[0] = 1;
  159.     for (ll i = 1; i <= total_cards; ++i) {
  160.         factorial[i] = Mmul(factorial[i - 1], i, BIG_PRIME);
  161.     }
  162.  
  163.     ll numerator = f(1, 0, 0, 0);
  164.     ll denominator = total_permutations();
  165.     cout << "total card: " << total_cards << endl;
  166.     cout << numerator << endl << denominator << endl;
  167.     cout << Mdiv(numerator, denominator, BIG_PRIME) << endl;
  168.  
  169.     return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement