Guest User

Untitled

a guest
Jan 16th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.26 KB | None | 0 0
  1. using poly = vector<int>;
  2.  
  3.  
  4. void bit_reverse_swap(poly &a) {
  5. int n = SZ(a);
  6. for (int i = 1, j = n >> 1, k; i < n - 1; i++) {
  7. if (i < j) swap(a[i], a[j]);
  8. //tricky
  9. for (k = n >> 1; j >= k; j -= k, k >>= 1); //inspect the highest "1"
  10. j += k;
  11. }
  12. }
  13.  
  14. const int g = 3; // mod 998244353 下的最小原根
  15. void FFT(poly &a, int type) {
  16. bit_reverse_swap(a);
  17. int n = SZ(a);
  18. for (int i = 2; i <= n; i *= 2) {
  19. const auto wi = fp(g, type * (mod - 1) / i); // fp(g, (mod - 1) / i) 是 i 次单位根
  20. for (int j = 0; j < n; j += i) {
  21. auto w(1);
  22. for (int k = j, h = i / 2; k < j + h; k++) {
  23. auto t = Mul(w, a[k + h]), u = a[k];
  24. a[k] = Add(u, t);
  25. a[k + h] = Sub(u, t);
  26. mul(w, wi);
  27. }
  28. }
  29. }
  30. const int inv = fp(n, -1);
  31. if (type == -1) for (auto &x : a) mul(x, inv);
  32. }
  33.  
  34.  
  35. void mul(poly &a, const poly &b) {
  36. int n = pow2(SZ(a) + SZ(b) - 1);
  37. auto _b = b;
  38. a.resize(n), _b.resize(n);
  39. FFT(a, 1), FFT(_b, 1);
  40. rng (i, 0, n) mul(a[i], _b[i]);
  41. FFT(a, -1);
  42. }
  43.  
  44.  
  45. void fp(poly &a, const int n) {
  46. a.resize((ul)pow2((SZ(a)-1) * n + 1));
  47. FFT(a, 1);
  48. for(auto &x: a) x = fp(x, n);
  49. FFT(a, -1);
  50. }
Add Comment
Please, Sign In to add comment