QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#839470 | #9945. Circular Convolution | TJUHuangTao | WA | 1ms | 3616kb | C++23 | 2.8kb | 2025-01-01 19:43:56 | 2025-01-01 19:44:04 |
Judging History
answer
#include <bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
#define ll __int128_t
#define pii pair<int, int>
#define tii tuple<int, int, int>
#define db double
#define all(a) a.begin(), a.end()
using namespace std;
const int maxn = 1e5 + 10;
const int mod = 998244353;
const int P = 4179340454199820289, g = 3;
// 大模数39582418599937=9×2^42 + 1,g = 5 (乘法地方得用int128防爆)
struct POLY {
#define poly vector<int>
int pow(int a, int b) {
ll ans = 1;
while (b) {
if (b & 1) {
ans = (ll)1 * ans * a % P;
}
a = (ll)1 * (ll)a * a % P;
b >>= 1;
}
return ans;
}
poly bit_reverse_copy(poly a) {
int n = a.size();
for (int i = 1, j = 0, k; i < n; ++i) {
for (k = n >> 1; j >= k; j -= k, k >>= 1)
;
j += k;
if (i < j) {
swap(a[i], a[j]);
}
}
return a;
}
poly NTT(poly a, int opt) {
int n = a.size();
a = bit_reverse_copy(a);
for (int l = 2; l <= n; l <<= 1) {
int omega = pow(g, (P - 1) / l);
if (opt == -1) {
omega = pow(omega, P - 2);
}
for (int i = 0; i < n; i += l) {
int u, v, w = 1;
for (int j = i; j < i + (l >> 1); ++j) {
u = a[j];
v = (ll)1 * w * a[j + (l >> 1)] % P;
a[j] = (u + v) % P;
a[j + (l >> 1)] = (u - v + P) % P;
w = (ll)1 * w * omega % P;
}
}
}
if (opt == -1) {
int inv = pow(n, P - 2);
for (int i = 0; i < n; ++i) {
a[i] = (ll)1 * a[i] * inv % P;
}
}
return a;
}
poly mul(poly a, poly b) {
int len = a.size() + b.size() - 1;
int siz = 1;
while (siz < len)
siz <<= 1;
a.resize(siz), b.resize(siz);
a = NTT(a, 1), b = NTT(b, 1);
for (int i = 0; i < siz; ++i)
a[i] = (ll)1 * a[i] * b[i] % P;
a = NTT(a, -1);
a.resize(len);
return a;
}
} Poly;
void solve() {
int n; cin >> n;
poly a(n), b(n);
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i];
poly c = Poly.mul(a, b);
for (int i = 0; i < n; i++) {
int tem = c[i] + c[i + n];
if (tem > 2e18) tem -= 2e18;
cout << tem << " ";
}
}
signed main() {
// freopen("1.in", "r", stdin);
// freopen("1.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3592kb
input:
3 1 1 4 5 1 4
output:
13 22 25
result:
ok 3 number(s): "13 22 25"
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 3616kb
input:
3 1 2 3 -1 2 0
output:
2179340454199820288 0 1
result:
wrong answer 1st numbers differ - expected: '5', found: '2179340454199820288'