Advertisement
slash0t

ntt

Aug 1st, 2024 (edited)
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.77 KB | None | 0 0
  1. int bitPow(int num, int pow) {
  2.     if (pow == 0) return 1;
  3.     if (pow % 2 == 0) {
  4.         int temp = bitPow(num, pow / 2);
  5.         return temp * temp % M;
  6.     }
  7.     return bitPow(num, pow - 1) * num % M;
  8. }
  9.  
  10. // M = 998244353;
  11. void ntt(vector<int>& a, bool inv) {
  12.     int n = a.size();
  13.     if (n == 1) {
  14.         return;
  15.     }
  16.  
  17.     vector<int> a0(n / 2), a1(n / 2);
  18.     for (int i = 0; i < n / 2; i++) {
  19.         a0[i] = a[2 * i];
  20.         a1[i] = a[2 * i + 1];
  21.     }
  22.     ntt(a0, 0);
  23.     ntt(a1, 0);
  24.  
  25.     int w = 1, wn = bitPow(3, (M - 1) / n);
  26.  
  27.     for (int i = 0; i < n / 2; i++) {
  28.         a[i] = (a0[i] + w * a1[i] % M) % M;
  29.         a[i + n / 2] = (a0[i] - w * a1[i] % M + M) % M;
  30.         w = wn * w % M;
  31.     }
  32.  
  33.     int nn = bitPow(n, M - 2);
  34.     if (inv) {
  35.         for (int i = 0; i < n; i++) a[i] = a[i] * nn % M;
  36.         reverse(++a.begin(), a.end());
  37.     }
  38. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement