結果
| 問題 |
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;
}