QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#839472#9945. Circular ConvolutionTJUHuangTaoWA 1ms3796kbC++232.8kb2025-01-01 19:45:182025-01-01 19:45:25

Judging History

This is the latest submission verdict.

  • [2025-01-01 19:45:25]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 3796kb
  • [2025-01-01 19:45:18]
  • Submitted

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];
        tem %= P;
        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: 3796kb

input:

3
1 1 4
5 1 4

output:

13 22 25 

result:

ok 3 number(s): "13 22 25"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3600kb

input:

3
1 2 3
-1 2 0

output:

5 0 1 

result:

ok 3 number(s): "5 0 1"

Test #3:

score: -100
Wrong Answer
time: 0ms
memory: 3592kb

input:

3
1 2 4
-1 1 0

output:

3 4179340454199820288 4179340454199820287 

result:

wrong answer 2nd numbers differ - expected: '-1', found: '4179340454199820288'