QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#839475#9945. Circular ConvolutionTJUHuangTaoAC ✓933ms84408kbC++232.8kb2025-01-01 19:46:402025-01-01 19:46:45

Judging History

This is the latest submission verdict.

  • [2025-01-01 19:46:45]
  • Judged
  • Verdict: AC
  • Time: 933ms
  • Memory: 84408kb
  • [2025-01-01 19:46:40]
  • 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;
        if (tem > 2e18) tem = 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;
}

这程序好像有点Bug,我给组数据试试?

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3472kb

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: 3648kb

input:

3
1 2 3
-1 2 0

output:

5 0 1 

result:

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

Test #3:

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

input:

3
1 2 4
-1 1 0

output:

3 -1 -2 

result:

ok 3 number(s): "3 -1 -2"

Test #4:

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

input:

1
1000000
1000000

output:

1000000000000 

result:

ok 1 number(s): "1000000000000"

Test #5:

score: 0
Accepted
time: 841ms
memory: 84180kb

input:

1000000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

result:

ok 1000000 numbers

Test #6:

score: 0
Accepted
time: 933ms
memory: 84236kb

input:

1000000
-881218 -558526 -910874 -6842 -969355 -727356 -908202 -230188 -861493 -755231 -547147 -361322 -259909 -134366 -104312 -683109 -972495 -784717 -75027 -899836 -645370 -386525 -440026 -13261 -402678 -624676 -970518 -84749 -454793 -199069 -973352 -771037 -314793 -987539 -422981 -953310 -199002 -...

output:

249834516261376798 250033244986869814 250018516809656471 250043162241643084 250047307005230848 249960143714092741 249955852221357355 250026384381548618 250026566302278862 250107844830331063 250033211167036624 249949178512153648 249898401524703709 249953245638099686 250023894911609754 250055432589110...

result:

ok 1000000 numbers

Test #7:

score: 0
Accepted
time: 909ms
memory: 84256kb

input:

1000000
-244143 -318385 -84411 -659901 -387443 -393190 -721118 -815116 -583259 -194739 -573885 -232923 -61218 -222501 -189798 -554526 -991747 -625587 -612090 -473805 -194134 -941634 -424202 -576051 -909521 -690138 -943368 -891988 -353552 -816696 -885432 -742507 -458420 -600109 -855439 -902837 -80392...

output:

-250074871578842656 -250088113357700559 -250078217851617648 -250049969537750742 -250056603065134701 -249855489692635943 -250211781201155662 -250047808060569385 -250178191755038773 -250000367370784737 -250137967276045426 -250116417392510501 -250077227189695913 -250013462047390822 -250076170499924409 ...

result:

ok 1000000 numbers

Test #8:

score: 0
Accepted
time: 900ms
memory: 84196kb

input:

1000000
40294 99189 51012 931381 955639 543132 762355 103301 505918 244990 698443 13278 888012 482791 651043 516121 691970 354140 720164 278143 854144 270288 545769 407595 454492 496583 367071 283582 305013 234990 884928 665488 841102 958941 867143 803781 557566 514110 661010 73686 316586 291775 361...

output:

-250205446227611386 -250020742913854804 -249972053970618660 -249975149335282898 -250257255163393273 -250155223665496482 -250058101128244782 -250067355354257164 -250095732772245476 -250061045996261711 -250044806624780120 -250255772429185360 -249996323431547260 -250153765571482971 -250139102184222596 ...

result:

ok 1000000 numbers

Test #9:

score: 0
Accepted
time: 859ms
memory: 84328kb

input:

1000000
469332 612406 71864 182361 658530 523011 128358 148877 811695 174528 791736 571047 947754 153489 922162 779501 403926 932713 690052 791389 102016 910572 991073 130755 443166 608617 89477 729712 323867 728316 354913 44680 626275 660228 377372 388201 30289 155291 869601 902762 260385 446071 55...

output:

249939222142324350 250132228334349475 249849471658526061 249937390947108604 249776508374821074 250019006414139702 249930092026953810 249934730902520693 250143277409107846 249850187798291162 250055472245115919 250042051840196727 249926112608285715 249921142645886686 249963430650128673 250106653773989...

result:

ok 1000000 numbers

Test #10:

score: 0
Accepted
time: 910ms
memory: 84196kb

input:

1000000
300230 292922 -995401 370882 179817 199069 989506 366968 645979 -809137 -625612 776930 612110 213436 743788 -90235 266341 585638 567461 807130 -706393 -954604 -251889 660518 514337 -816366 999288 -67802 742960 -817172 -503331 -310956 -996235 -205427 -760416 5535 -743090 -745243 -590814 21639...

output:

-54578923406269 -344381624644882 -49477818022696 -198899401294729 -421742309734512 137666347813798 -614057418429011 -240377390120834 -519784276700200 -326928035615419 30654955732187 -72356077172109 82228640365849 327918601789307 -211269480540125 -172100936860232 -252985060248223 587523937408663 2971...

result:

ok 1000000 numbers

Test #11:

score: 0
Accepted
time: 906ms
memory: 84268kb

input:

1000000
-965355 -973814 -941545 -900007 -905236 -975973 -907953 -970797 -956357 -920234 -902251 -935696 -983093 -983837 -922495 -900797 -945800 -916916 -919619 -936041 -998716 -923245 -934691 -936340 -991295 -914577 -914480 -938360 -941430 -949861 -982090 -951117 -996457 -964080 -956773 -952236 -968...

output:

902396841689972823 902398003112777444 902397638317968666 902397835457248514 902397092881342298 902398460687813431 902398582990135329 902398211792787077 902397732497013967 902397748129022149 902398273649459544 902396608982103493 902397708531257605 902396936897931126 902395912311738148 902396734056645...

result:

ok 1000000 numbers

Test #12:

score: 0
Accepted
time: 901ms
memory: 84180kb

input:

1000000
-957202 -951014 -995712 -988330 -913423 -901346 -979869 -941576 -953518 -985899 -940745 -988619 -937604 -960712 -997473 -911218 -949655 -916451 -922041 -992449 -988811 -964807 -992694 -947543 -905602 -937092 -980861 -976223 -994867 -984745 -905230 -999913 -974119 -954392 -964833 -944402 -956...

output:

-902533113699173718 -902534618091798535 -902534239877444203 -902535303312266556 -902535160680650165 -902535404080880238 -902534920241960958 -902534362586301951 -902534931924870421 -902535577010071526 -902534650586473681 -902535749580041903 -902534366183727076 -902534192164208458 -902535063007371644 ...

result:

ok 1000000 numbers

Test #13:

score: 0
Accepted
time: 894ms
memory: 84196kb

input:

1000000
990047 975433 978844 954292 902479 904107 959519 950050 991288 934653 911787 934833 941903 980320 991788 980618 970606 920195 913576 920289 943687 909247 956602 907683 980563 978227 933683 989924 965673 960863 940823 955429 994834 939106 949372 914148 934966 951504 972905 919969 967414 93339...

output:

-902482669371786372 -902483646800995552 -902482140831124598 -902482350975424255 -902482264230278612 -902483819914500107 -902483550274534145 -902482153106385866 -902483569467977757 -902482368153094649 -902483129297145464 -902482854378694723 -902483457546777835 -902482421410864514 -902483203311510590 ...

result:

ok 1000000 numbers

Test #14:

score: 0
Accepted
time: 900ms
memory: 84396kb

input:

1000000
977050 939628 940081 932059 965223 982023 989318 961137 991677 926505 989796 949767 946378 929043 966684 903064 996521 924301 939417 940747 978414 901943 939799 954644 927528 945659 947184 971942 968657 998013 916387 923000 908080 988205 914006 996984 909522 953811 979528 954266 969996 96036...

output:

902475483737136868 902476175992903157 902477749436457461 902476598647953889 902476740117746483 902476889156610553 902477288789438553 902475571462347980 902476037932756778 902477110029005529 902477625197698250 902476056542717365 902475610109905720 902475506895997410 902476295978838528 902477132886525...

result:

ok 1000000 numbers

Test #15:

score: 0
Accepted
time: 930ms
memory: 84196kb

input:

1000000
-1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -100...

output:

1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 ...

result:

ok 1000000 numbers

Test #16:

score: 0
Accepted
time: 889ms
memory: 84408kb

input:

1000000
-1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -1000000 -100...

output:

-1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -10000...

result:

ok 1000000 numbers

Test #17:

score: 0
Accepted
time: 885ms
memory: 84312kb

input:

1000000
1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000...

output:

-1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -1000000000000000000 -10000...

result:

ok 1000000 numbers

Test #18:

score: 0
Accepted
time: 896ms
memory: 84200kb

input:

1000000
1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000000 1000...

output:

1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 1000000000000000000 ...

result:

ok 1000000 numbers

Extra Test:

score: 0
Extra Test Passed