Dang_Quan_10_Tin

ChineseRemainTheory

Jul 18th, 2021
1,298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1.  
  2. struct Pair
  3. {
  4.     /*x = a (mod p)
  5.     first = a
  6.     second = p = v^k
  7.     third = phi(p) 
  8.     */
  9.     ll first, second, third;
  10.     Pair(ll x = 0, ll y = 0, ll z = 0) : first(x), second(y), third(z) {}
  11. };
  12.  
  13.  
  14. ll Pow(ll a, ll b, ll mod)
  15. {
  16.     a %= mod;
  17.     ll ans(1);
  18.     for (; b; b >>= 1)
  19.     {
  20.         if (b & 1)
  21.             ans = ans * a % mod;
  22.         a = a * a % mod;
  23.     }
  24.     return ans;
  25. }
  26.  
  27. ll ChineseRemainTheory(vector<Pair> s)
  28. {
  29.     ll ans(0), mod(1);
  30.     for (auto i : s)
  31.         mod *= i.second;
  32.     vector<ll> pref(s.size()), suf(s.size());
  33.     for (int i = 0; i < (int)s.size(); ++i)
  34.     {
  35.         pref[i] = i == 0 ? s[i].second : (pref[i - 1] * s[i].second % mod);
  36.         suf[s.size() - 1 - i] = i == 0 ? s[s.size() - 1].second : (suf[s.size() - i] * s[s.size() - 1 - i].second % mod);
  37.     }
  38.     for (int i = 0; i < (int)s.size(); ++i)
  39.     {
  40.         //cout << s[i].first << " " << s[i].second << " " << s[i].third << "\n";
  41.         ll tmp(s[i].first), tmp2(1);
  42.         tmp = (tmp2 = (i == 0 ? 1 : pref[i - 1]) * (i < (int)s.size() - 1 ? suf[i + 1] : 1) % mod) * s[i].first % mod;
  43.         (ans += tmp * Pow(tmp2, s[i].third - 1, mod)) %= mod;
  44.     }
  45.     return ans;
  46. }
Advertisement
Add Comment
Please, Sign In to add comment