提交记录 21119
提交时间 |
评测时间 |
2024-01-31 14:29:13 |
2024-01-31 14:29:20 |
# include <bits/stdc++.h>
using namespace std;
namespace lyre {
constexpr int P(998'244'353);
constexpr int pow(int a, int n) {
auto r(1);
while (n) {
r = 1l * r * (n & 1 ? a : 1) % P;
n >>= 1, a = 1l * a * a % P;
}
return r;
}
constexpr int inv(int a)
{ return pow(a, P - 2); }
class poly : public vector<int> {
public:
using vector<int>::vector;
void reserve() {
while (size() != (size() & -size()))
emplace_back();
}
void dif() {
int const n(size());
vector<int> trans(n);
for (int i(0); i < n; ++i)
trans[i] = (trans[i >> 1] >> 1) + (i & 1) * (n >> 1);
for (int i(0); i < n; ++i)
if (i < trans[i]) std::swap(at(i), at(trans[i]));
for (int mid(1); mid < n; mid *= 2) {
auto w1(pow(3, (P - 1) / (mid * 2)));
for (int i(0); i < n; i += mid * 2) {
auto wk(1);
for (int j(0), k(mid); j < mid; ++j, ++k) {
auto x(at(i + j));
auto y(1l * wk * at(i + k) % P);
at(i + j) = (x + y) % P;
at(i + k) = (x + P - y) % P;
wk = 1l * wk * w1 % P;
}
}
}
}
void dit() {
int const n(size());
vector<int> trans(n);
for (int i(0); i < n; ++i)
trans[i] = (trans[i >> 1] >> 1) + (i & 1) * (n >> 1);
for (int i(0); i < n; ++i)
if (i < trans[i]) std::swap(at(i), at(trans[i]));
for (int mid(1); mid < n; mid *= 2) {
auto w1(pow(inv(3), (P - 1) / (mid * 2)));
for (int i(0); i < n; i += mid * 2) {
auto wk(1);
for (int j(0), k(mid); j < mid; ++j, ++k) {
auto x(at(i + j));
auto y(1l * wk * at(i + k) % P);
at(i + j) = (x + y) % P;
at(i + k) = (x + P - y) % P;
wk = 1l * wk * w1 % P;
}
}
}
for (int i(0); i < n; ++i)
at(i) = 1l * at(i) * inv(n) % P;
}
poly operator*(const poly &o) const {
auto f(*this), g(o);
poly h(f.size() + g.size() - 1);
h.reserve();
f.resize(h.size()), f.dif();
g.resize(h.size()), g.dif();
for (auto i(0u); i < h.size(); ++i)
h[i] = 1l * f[i] * g[i] % P;
h.dit();
return h;
}
};
void main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
poly f(n + 1), g(m + 1);
for (int i(0); i <= n; ++i) cin >> f[i];
for (int i(0); i <= m; ++i) cin >> g[i];
auto const h(f * g);
for (int i(0); i <= n + m; ++i) cout << h[i] << " \n"[i == n + m];
}
}
int main() { lyre::main(); }
Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
Subtask #1 Testcase #1 | 51.46 us | 60 KB | Accepted | Score: 100 | 显示更多 |
Subtask #1 Testcase #2 | 99.902 ms | 6 MB + 796 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #3 | 47.546 ms | 2 MB + 1016 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #4 | 47.514 ms | 2 MB + 1004 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #5 | 46.55 us | 60 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #6 | 43.74 us | 60 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #7 | 43.76 us | 60 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #8 | 95.467 ms | 6 MB + 124 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #9 | 95.456 ms | 6 MB + 124 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #10 | 90.552 ms | 5 MB + 472 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #11 | 99.953 ms | 6 MB + 876 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #12 | 96.939 ms | 5 MB + 756 KB | Accepted | Score: 0 | 显示更多 |
Subtask #1 Testcase #13 | 41.51 us | 60 KB | Accepted | Score: 0 | 显示更多 |
Judge Duck Online | 评测鸭在线
Server Time: 2025-07-21 00:43:55 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠