Advertisement
cosenza987

sssdadsawdasdas

Jul 10th, 2023
790
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.49 KB | None | 0 0
  1. //Слава Україні, Героям слава
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. namespace fft {
  8.     typedef long double dbl;
  9.  
  10.     struct num {
  11.         dbl x, y;
  12.         num() { x = y = 0; }
  13.         num(dbl x, dbl y) : x(x), y(y) {}
  14.     };
  15.  
  16.     inline num operator+ (num a, num b) { return num(a.x + b.x, a.y + b.y); }
  17.     inline num operator- (num a, num b) { return num(a.x - b.x, a.y - b.y); }
  18.     inline num operator* (num a, num b) { return num(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x); }
  19.     inline num conj(num a) { return num(a.x, -a.y); }
  20.  
  21.     int base = 1;
  22.     vector<num> roots = { {0, 0}, {1, 0} };
  23.     vector<int> rev = { 0, 1 };
  24.  
  25.     const dbl PI = acosl(-1.0);
  26.  
  27.     void ensure_base(int nbase) {
  28.         if (nbase <= base) return;
  29.  
  30.         rev.resize(1 << nbase);
  31.         for (int i = 0; i < (1 << nbase); i++) {
  32.             rev[i] = (rev[i >> 1] >> 1) + ((i & 1) << (nbase - 1));
  33.         }
  34.         roots.resize(1 << nbase);
  35.  
  36.         while (base < nbase) {
  37.             dbl angle = 2 * PI / (1 << (base + 1));
  38.             for (int i = 1 << (base - 1); i < (1 << base); i++) {
  39.                 roots[i << 1] = roots[i];
  40.                 dbl angle_i = angle * (2 * i + 1 - (1 << base));
  41.                 roots[(i << 1) + 1] = num(cos(angle_i), sin(angle_i));
  42.             }
  43.             base++;
  44.         }
  45.     }
  46.  
  47.     void fft(vector<num>& a, int n = -1) {
  48.         if (n == -1) {
  49.             n = a.size();
  50.         }
  51.         assert((n & (n - 1)) == 0);
  52.         int zeros = __builtin_ctz(n);
  53.         ensure_base(zeros);
  54.         int shift = base - zeros;
  55.         for (int i = 0; i < n; i++) {
  56.             if (i < (rev[i] >> shift)) {
  57.                 swap(a[i], a[rev[i] >> shift]);
  58.             }
  59.         }
  60.         for (int k = 1; k < n; k <<= 1) {
  61.             for (int i = 0; i < n; i += 2 * k) {
  62.                 for (int j = 0; j < k; j++) {
  63.                     num z = a[i + j + k] * roots[j + k];
  64.                     a[i + j + k] = a[i + j] - z;
  65.                     a[i + j] = a[i + j] + z;
  66.                 }
  67.             }
  68.         }
  69.     }
  70.  
  71.     vector<num> fa, fb;
  72.     vector<long long> multiply(vector<long long>& a, vector<long long>& b) {
  73.         int need = a.size() + b.size() - 1;
  74.         int nbase = 0;
  75.         while ((1 << nbase) < need) nbase++;
  76.         ensure_base(nbase);
  77.         int sz = 1 << nbase;
  78.         if (sz > (int)fa.size()) {
  79.             fa.resize(sz);
  80.         }
  81.         for (int i = 0; i < sz; i++) {
  82.             long long x = (i < (int)a.size() ? a[i] : 0);
  83.             long long y = (i < (int)b.size() ? b[i] : 0);
  84.             fa[i] = num(x, y);
  85.         }
  86.         fft(fa, sz);
  87.         num r(0, -0.25 / sz);
  88.         for (int i = 0; i <= (sz >> 1); i++) {
  89.             int j = (sz - i) & (sz - 1);
  90.             num z = (fa[j] * fa[j] - conj(fa[i] * fa[i])) * r;
  91.             if (i != j) {
  92.                 fa[j] = (fa[i] * fa[i] - conj(fa[j] * fa[j])) * r;
  93.             }
  94.             fa[i] = z;
  95.         }
  96.         fft(fa, sz);
  97.         vector<long long> res(need);
  98.         for (int i = 0; i < need; i++) {
  99.             res[i] = fa[i].x + 0.5;
  100.         }
  101.         return res;
  102.     }
  103.  
  104.     vector<int> multiply_mod(vector<int>& a, vector<int>& b, int m, int eq = 0) {
  105.         int need = a.size() + b.size() - 1;
  106.         int nbase = 0;
  107.         while ((1 << nbase) < need) nbase++;
  108.         ensure_base(nbase);
  109.         int sz = 1 << nbase;
  110.         if (sz > (int)fa.size()) {
  111.             fa.resize(sz);
  112.         }
  113.         for (int i = 0; i < (int)a.size(); i++) {
  114.             int x = (a[i] % m + m) % m;
  115.             fa[i] = num(x & ((1 << 15) - 1), x >> 15);
  116.         }
  117.         fill(fa.begin() + a.size(), fa.begin() + sz, num{ 0, 0 });
  118.         fft(fa, sz);
  119.         if (sz > (int) fb.size()) {
  120.             fb.resize(sz);
  121.         }
  122.         if (eq) {
  123.             copy(fa.begin(), fa.begin() + sz, fb.begin());
  124.         }
  125.         else {
  126.             for (int i = 0; i < (int)b.size(); i++) {
  127.                 int x = (b[i] % m + m) % m;
  128.                 fb[i] = num(x & ((1 << 15) - 1), x >> 15);
  129.             }
  130.             fill(fb.begin() + b.size(), fb.begin() + sz, num{ 0, 0 });
  131.             fft(fb, sz);
  132.         }
  133.         dbl ratio = 0.25 / sz;
  134.         num r2(0, -1);
  135.         num r3(ratio, 0);
  136.         num r4(0, -ratio);
  137.         num r5(0, 1);
  138.         for (int i = 0; i <= (sz >> 1); i++) {
  139.             int j = (sz - i) & (sz - 1);
  140.             num a1 = (fa[i] + conj(fa[j]));
  141.             num a2 = (fa[i] - conj(fa[j])) * r2;
  142.             num b1 = (fb[i] + conj(fb[j])) * r3;
  143.             num b2 = (fb[i] - conj(fb[j])) * r4;
  144.             if (i != j) {
  145.                 num c1 = (fa[j] + conj(fa[i]));
  146.                 num c2 = (fa[j] - conj(fa[i])) * r2;
  147.                 num d1 = (fb[j] + conj(fb[i])) * r3;
  148.                 num d2 = (fb[j] - conj(fb[i])) * r4;
  149.                 fa[i] = c1 * d1 + c2 * d2 * r5;
  150.                 fb[i] = c1 * d2 + c2 * d1;
  151.             }
  152.             fa[j] = a1 * b1 + a2 * b2 * r5;
  153.             fb[j] = a1 * b2 + a2 * b1;
  154.         }
  155.         fft(fa, sz);
  156.         fft(fb, sz);
  157.         vector<int> res(need);
  158.         for (int i = 0; i < need; i++) {
  159.             long long aa = fa[i].x + 0.5;
  160.             long long bb = fb[i].x + 0.5;
  161.             long long cc = fa[i].y + 0.5;
  162.             res[i] = (aa + ((bb % m) << 15) + ((cc % m) << 30)) % m;
  163.         }
  164.         return res;
  165.     }
  166.  
  167.     vector<int> square_mod(vector<int>& a, int m) {
  168.         return multiply_mod(a, a, m, 1);
  169.     }
  170. }
  171.  
  172. struct Centroid {
  173.     vector<vector<pair<int, int>>> adj;
  174.     vector<long long> ans;
  175.     vector<bool> vis;
  176.     vector<int> par, sz;
  177.     int n;
  178.     Centroid(int n_) {
  179.         n = n_;
  180.         adj.resize(n + 1); vis.resize(n + 1);
  181.         par.resize(n + 1); sz.resize(n + 1);
  182.     }
  183.     void add(int a, int b, int c) {
  184.         adj[a].push_back({b, c});
  185.         adj[b].push_back({a, c});
  186.     }
  187.     int dfs_sz(int v, int p = -1) {
  188.         if(vis[v]) {
  189.             return 0;
  190.         }
  191.         sz[v] = 1;
  192.         for(auto x : adj[v]) {
  193.             if(x.first != p) {
  194.                 sz[v] += dfs_sz(x.first, v);
  195.             }
  196.         }
  197.         return sz[v];
  198.     }
  199.     int centroid(int v, int p, int size) {
  200.         for(auto x : adj[v]) {
  201.             if(x.first != p and !vis[x.first] and sz[x.first] > size / 2) {
  202.                 return centroid(x.first, v, size);
  203.             }
  204.         }
  205.         return v;
  206.     }
  207.     void dfs(vector<long long> &path, int i, int ok, int p = -1, int d = 1) {
  208.         if(ok) {
  209.             if(path.size() > d) {
  210.                 path[d]++;
  211.             } else {
  212.                 path.push_back(1);
  213.             }
  214.         }
  215.         for(auto j : adj[i]) {
  216.             if(j.first != p and !vis[j.first]) {
  217.                 dfs(path, j.first, j.second, i, d + j.second);
  218.             }
  219.         }
  220.     }
  221.     void decomp(int i = 1) {
  222.         int c = centroid(i, i, dfs_sz(i));
  223.         vis[c] = true;
  224.         vector<long long> s = {0}, sqs = {0};
  225.         for(auto j : adj[c]) {
  226.             if(!vis[j.first]) {
  227.                 vector<long long> cur = {0};
  228.                 dfs(cur, j.first, j.second, -1, j.second);
  229.                 if(s.size() < cur.size()) s.resize(cur.size());
  230.                 if(ans.size() < cur.size()) ans.resize(cur.size());
  231.                 for(int i = 0; i < (int)cur.size(); i++) {
  232.                     s[i] += cur[i];
  233.                     if(j.second) ans[i] += cur[i];
  234.                 }
  235.                 cur = fft::multiply(cur, cur);
  236.                 if(sqs.size() < cur.size()) sqs.resize(cur.size());
  237.                 for(int i = 0; i < (int)cur.size(); i++) {
  238.                     sqs[i] += cur[i];
  239.                 }
  240.             }
  241.         }
  242.         //s[0] = 1;
  243.         s = fft::multiply(s, s);
  244.         for(int i = 0; i < (int)sqs.size(); i++) {
  245.             s[i] -= sqs[i];
  246.         }
  247.         if(ans.size() < s.size()) ans.resize(s.size());
  248.         for(int i = 1; i < (int)s.size(); i++) {
  249.             ans[i] += s[i] >> 1;
  250.         }
  251.         for(auto j : adj[c]) {
  252.             if(!vis[j.first]) {
  253.                 decomp(j.first);
  254.             }
  255.         }
  256.         vis[c] = false;
  257.     }
  258. };
  259.  
  260. long long binexp(long long a, long long n, int mod) {
  261.     long long res = 1;
  262.     while(n) {
  263.         if(n & 1) {
  264.             res = (res * a) % mod;
  265.         }
  266.         n >>= 1;
  267.         a = (a * a) % mod;
  268.     }
  269.     return res;
  270. }
  271.  
  272. const int N = 4e5 + 7;
  273.  
  274. namespace ntt {
  275.     long long w[N], k, nrev;
  276.     inline void init(int n, int root, int mod) {
  277.         w[0] = 1;
  278.         k = binexp(root, (mod - 1) / n, mod);
  279.         nrev = binexp(n, mod - 2, mod);
  280.         for(int i = 1; i <= n; i++) {
  281.             w[i] = (w[i - 1] * k) % mod;
  282.         }
  283.     }
  284.     inline void ntt(vector<long long> &a, int n, int mod, bool inv = false) {
  285.         a.resize(n);
  286.         for(int i = 0, j = 0; i < n; i++) {
  287.             if(i > j) swap(a[i], a[j]);
  288.             for(int l = n / 2; (j ^= l) < l; l >>= 1);
  289.         }
  290.         for(int i = 2; i <= n; i <<= 1) {
  291.             for(int j = 0; j < n; j += i) {
  292.                 for(int l = 0; l < i / 2; l++) {
  293.                     int x = j + l, y = j + l + (i / 2), z = (n / i) * l;
  294.                     long long tmp = (a[y] * w[(inv ? (n - z) : z)]) % mod;
  295.                     a[y] = (a[x] - tmp + mod) % mod;
  296.                     a[x] = (a[j + l] + tmp) % mod;
  297.                 }
  298.             }
  299.         }
  300.         if(inv) {
  301.             for(int i = 0; i < n; i++) {
  302.                 a[i] = (a[i] * nrev) % mod;
  303.             }
  304.         }
  305.     }
  306.     vector<long long> multiply(vector<long long>& a, vector<long long>& b, int n, int root = 3, int mod = 998244353) {
  307.         init(2 * n, root, mod);
  308.         a.resize(2 * n);
  309.         b.resize(2 * n);
  310.         ntt(a, 2 * n, mod);
  311.         ntt(b, 2 * n, mod);
  312.         vector<long long> ans(2 * n);
  313.         for(int i = 0; i < 2 * n; i++) {
  314.             ans[i] = (a[i] * b[i]) % mod;
  315.         }
  316.         ntt(ans, 2 * n, mod, true);
  317.         return ans;
  318.     }
  319.     vector<long long> multiply_garner(vector<long long> &a, vector<long long> &b, int n, int mod) {
  320.         vector<long long> primes = {1004535809, 998244353, 985661441};
  321.         vector<long long> x[3], y[3], z[3];
  322.         for(int p = 0; p < 3; p++) {
  323.             x[p].resize(n);
  324.             y[p].resize(n);
  325.             for(int i = 0; i < n; i++) {
  326.                 x[p][i] = a[i] % primes[p];
  327.                 y[p][i] = b[i] % primes[p];
  328.             }
  329.         }
  330.         for(int p = 0; p < 3; p++) {
  331.             z[p] = multiply(x[p], y[p], n, 3, primes[p]);
  332.         }
  333.         vector<long long> ans(n);
  334.         long long r01 = binexp(primes[0], primes[1] - 2, primes[1]);
  335.         long long r02 = binexp(primes[0], primes[2] - 2, primes[2]);
  336.         long long r12 = binexp(primes[1], primes[2] - 2, primes[2]);
  337.         for(int i = 0; i < n; i++) {
  338.             long long a0 = z[0][i];
  339.             long long a1 = (((z[1][i] - z[0][i] + 2 * primes[1]) % primes[1]) * r01) % primes[1];
  340.             long long a2 = (((z[2][i] - z[0][i] + 2 * primes[2]) % primes[2]) * r02) % primes[2];
  341.             a2 = ((a2 - a1 + 2 * primes[2]) % primes[2]) * r12 % primes[2];
  342.             long long res = a0 % mod;
  343.             res = (res + a1 * (primes[0] % mod)) % mod;
  344.             res = (res + a2 * ((primes[0] % mod) * (primes[1] % mod) % mod)) % mod;
  345.             ans[i] = res;
  346.         }
  347.         return ans;
  348.     }
  349. }
  350.  
  351. const int mod = 998244353;
  352.  
  353. long long fact[N], ifact[N];
  354.  
  355. int main() {
  356.     ios_base::sync_with_stdio(false);
  357.     cin.tie(nullptr);
  358.     fact[0] = 1;
  359.     for(long long i = 1; i < N; i++) {
  360.         fact[i] = fact[i - 1] * i % mod;
  361.     }
  362.     ifact[N - 1] = binexp(fact[N - 1], mod - 2, mod);
  363.     for(long long i = N - 2; i >= 0; i--) {
  364.         ifact[i] = (ifact[i + 1] * (i + 1)) % mod;
  365.     }
  366.     int n;
  367.     cin >> n;
  368.     Centroid cent(n);
  369.     for(int i = 1; i < n; i++) {
  370.         int a, b, c;
  371.         cin >> a >> b >> c;
  372.         cent.add(a, b, c);
  373.     }
  374.     cent.decomp();
  375.     vector<long long> b = cent.ans, a(n);
  376.     b.resize(n);
  377.     cout << b[1] << " ";
  378.     for(int i = 2; i < (int)b.size(); i++) {
  379.         b[i] %= mod;
  380.         b[i] = (b[i] * fact[i - 2]) % mod;
  381.     }
  382.     for(int i = 0; i < n; i++) {
  383.         a[i] = ifact[i];
  384.     }
  385.     reverse(a.begin(), a.end());
  386.     int x = 1;
  387.     while(x < (int)a.size()) {
  388.         x <<= 1;
  389.     }
  390.     a.resize(x);
  391.     b.resize(x);
  392.     vector<long long> c = ntt::multiply(a, b, x);
  393.     for(int i = 2; i <= n - 1; i++) {
  394.         cout << c[n + i - 1] * ifact[i - 2] % mod << " \n"[i == n - 1];
  395.     }
  396.     return 0;
  397. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement