結果
問題 |
No.1145 Sums of Powers
|
ユーザー |
|
提出日時 | 2025-02-20 05:36:33 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 288 ms / 2,000 ms |
コード長 | 2,578 bytes |
コンパイル時間 | 5,911 ms |
コンパイル使用メモリ | 320,340 KB |
実行使用メモリ | 25,940 KB |
最終ジャッジ日時 | 2025-02-20 05:36:41 |
合計ジャッジ時間 | 7,521 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 6 |
ソースコード
#include<bits/stdc++.h> using namespace std; using ll = long long; #include<atcoder/modint> using namespace atcoder; using mint = modint998244353; #include<atcoder/convolution> vector<mint> inv_table; vector<mint> fps_inv(vector<mint> f , int d = -1){ assert(f[0].val() != 0); int N = (int)f.size(); if(d == -1)d = N; vector<mint> g(1); g[0] = mint(1) / f[0]; for(int i = 0; (1<<i) < d; i++){ int len = min(d , 1<<(i+1)); vector<mint> tmp(len); for(int j = 0; j < min(N , len); j++)tmp[j] = -f[j]; tmp = convolution(g , tmp); tmp[0] += 2; g = convolution(g , tmp); g.resize(len); } return g; } vector<mint> fps_diff(vector<mint> f , int d = -1){ int N = (int)f.size(); if(d == -1)d = N-1; vector<mint> g(d); for(int i = 1; i < min(d , N); i++){ g[i-1] = f[i] * i; } return g; } vector<mint> fps_integral(vector<mint> f , int d = -1){ int N = (int)f.size(); if(d == -1)d = N; vector<mint> g(d); for(int i = 0; i < d-1; i++){ g[i+1] = f[i] * inv_table[i+1]; } return g; } vector<mint> fps_log(vector<mint> f , int d = -1){ assert(f[0].val() == 1); int N = (int)f.size(); if(d == -1)d = N; vector<mint> f_p = fps_diff(f , d); vector<mint> g = convolution(f_p , fps_inv(f , d)); g.resize(d); g = fps_integral(g , d); g.resize(d); return g; } vector<mint> fps_exp(vector<mint> f , int d = -1){ assert(f[0].val() == 0); int N = (int)f.size(); if(d == -1)d = N; vector<mint> g(1); g[0] = 1; for(int i = 0; (1<<i) < d; i++){ int len = min(d , 1<<(i+1)); vector<mint> tmp = fps_log(g , d); tmp.resize(len); for(int j = 0; j < len; j++)tmp[j] = f[j] - tmp[j]; tmp[0] += 1; g = convolution(g , tmp); g.resize(len); } return g; } // $B&2(B(A_i)^j (j = 0,..,K-1) vector<mint> fps_powers_sum(vector<mint> A , int K){ int N = (int)A.size(); vector<vector<mint>> f(N); for(int i = 0; i < N; i++){ f[i] = {1 , -A[i]}; } queue<int> q; for(int i = 0; i < N; i++)q.push(i); while(q.size() > 1){ int x = q.front(); q.pop(); int y = q.front(); q.pop(); if(x > y)swap(x , y); f[x] = convolution(f[x] , f[y]); q.push(x); } f[0].resize(K); vector<mint> ret = fps_log(f[0] , K); for(int i = 1; i < K; i++){ ret[i] = -ret[i] * i; } ret[0] = N; return ret; } int main(){ int N; cin >> N; int K; cin >> K; vector<mint> A(N); for(int i = 0; i < N; i++){ int a; cin >> a; A[i] = a; } inv_table.resize(K+2); for(int i = 1; i <= K+1; i++)inv_table[i] = mint(1) / i; vector<mint> ans = fps_powers_sum(A , K+1); for(int i = 1; i <= K; i++)cout << ans[i].val() << ' '; cout << endl; }