Dang_Quan_10_Tin

EUREKA

Sep 7th, 2020 (edited)
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.65 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <stack>
  5. #define NewVal vector<int>(46)
  6. #define task "EUREKA"
  7. using namespace std;
  8. using ll = long long;
  9. using ld = long double;
  10.  
  11. const int N = 3e5 + 2;
  12. int prime[] = {2, 3, 5, 7, 11, 13, 17, 19, 23,
  13.                29, 31, 37, 41, 43, 47, 53, 59,
  14.                61, 67, 71, 73, 79, 83, 89, 97,
  15.                101, 103, 107, 109, 113, 127,
  16.                131, 137, 139, 149, 151, 157,
  17.                163, 167, 173, 179, 181, 191,
  18.                193, 197, 199};
  19. int n, a[N];
  20. const ll mod = 123456789;
  21. vector<int> s[202];
  22.  
  23. void Prepare()
  24. {
  25.     for (int i = 1; i <= 200; ++i)
  26.     {
  27.         s[i].resize(46, 0);
  28.     }
  29.     for (int i = 0; i < 46; ++i)
  30.         for (int j = prime[i]; j <= 200; j += prime[i])
  31.         {
  32.             int v = j;
  33.             while (v % prime[i] == 0)
  34.             {
  35.                 v /= prime[i];
  36.                 ++s[j][i];
  37.             }
  38.         }
  39. }
  40.  
  41. void Read()
  42. {
  43.     cin >> n;
  44.     for (int i = 1; i <= 3 * n + 1; ++i)
  45.         cin >> a[i];
  46. }
  47.  
  48. vector<int> operator*(const vector<int> &a, const vector<int> &b)
  49. {
  50.     vector<int> ans(46);
  51.     for (int i = 0; i < 46; ++i)
  52.         ans[i] = a[i] + b[i];
  53.     return ans;
  54. }
  55.  
  56. vector<int> operator/(const vector<int> &a, const vector<int> &b)
  57. {
  58.     vector<int> ans(46);
  59.     for (int i = 0; i < 46; ++i)
  60.         ans[i] = a[i] - b[i];
  61.     return ans;
  62. }
  63.  
  64. vector<int> gcd(const vector<int> &a, const vector<int> &b)
  65. {
  66.     vector<int> ans(46);
  67.     for (int i = 0; i < 46; ++i)
  68.         ans[i] = min(a[i], b[i]);
  69.     return ans;
  70. }
  71.  
  72. ll Pow(ll a, int b)
  73. {
  74.     ll ans = 1;
  75.     for (; b > 0; b >>= 1)
  76.     {
  77.         if (b & 1)
  78.             ans = ans * a % mod;
  79.         a = a * a % mod;
  80.     }
  81.     return ans;
  82. }
  83.  
  84. void Solve()
  85. {
  86.     stack<vector<int>> st;
  87.     for (int i = 3 * n + 1; i; --i)
  88.     {
  89.         if (a[i] == -1)
  90.             st.push(NewVal);
  91.         else
  92.         {
  93.             int y = a[i--],
  94.                 x = a[i];
  95.             vector<int> p = st.top();
  96.             st.pop();
  97.             vector<int> q = st.top();
  98.             st.pop();
  99.             vector<int> d = gcd(p * s[x], q * s[y]),
  100.                         tu = p * q;
  101.             st.push(tu * s[x + y] / d);
  102.         }
  103.     }
  104.     ll ans = 1;
  105.     vector<int> cur = st.top();
  106.     for (int i = 0; i < 46; ++i)
  107.         ans = ans * Pow(prime[i], cur[i]) % mod;
  108.     cout << ans;
  109. }
  110.  
  111. int32_t main()
  112. {
  113.     ios::sync_with_stdio(0);
  114.     cin.tie(0);
  115.     cout.tie(0);
  116.     if (fopen(task ".INP", "r"))
  117.         freopen(task ".INP", "r", stdin),
  118.             freopen(task ".OUT", "w", stdout);
  119.     Prepare();
  120.     Read();
  121.     Solve();
  122. }
Advertisement
Add Comment
Please, Sign In to add comment