QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#848937 | #9945. Circular Convolution | Capps | AC ✓ | 1024ms | 100276kb | C++20 | 12.6kb | 2025-01-09 10:52:51 | 2025-01-09 10:52:52 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
template <class T>
constexpr T power(T a, long long b) {
T res = 1;
for (; b; b /= 2, a *= a) {
if (b & 1) {
res *= a;
}
}
return res;
}
template <class T, T P>
class ModuloInteger {
T x;
static T Mod;
using i64 = long long;
static constexpr int multip(int a, int b, const int Mod) {
return 1LL * a * b % Mod;
}
static constexpr i64 multip(i64 a, i64 b, const i64 p) {
i64 res = a * b - i64(1.L * a * b / p) * p;
res %= p;
if (res < 0) {
res += p;
}
return res;
}
constexpr T norm(T x) const {
return (x < 0 ? x + getMod() : (x >= getMod() ? x - getMod() : x));
}
public:
typedef T ValueType;
constexpr ModuloInteger() : x{} {}
constexpr ModuloInteger(i64 x) : x{norm(x % getMod())} {}
static constexpr T getMod() {
return (P > 0 ? P : Mod);
}
static constexpr void setMod(T Mod_) {
Mod = Mod_;
}
constexpr T val() const {
return x;
}
explicit constexpr operator T() const {
return x;
}
constexpr ModuloInteger operator-() const {
return ModuloInteger(getMod() - x);
}
constexpr ModuloInteger power(i64 m) const {
if (m < 0) {
return ::power(inv(), -m);
}
return ::power((*this), m);
}
constexpr ModuloInteger inv() const {
assert(x != 0);
return this->power(getMod() - 2);
}
constexpr ModuloInteger &operator*=(ModuloInteger rhs) & {
x = multip(x, rhs.x, getMod());
return *this;
}
constexpr ModuloInteger &operator+=(ModuloInteger rhs) & {
x = norm(x + rhs.x);
return *this;
}
constexpr ModuloInteger &operator-=(ModuloInteger rhs) & {
x = norm(x - rhs.x);
return *this;
}
constexpr ModuloInteger &operator/=(ModuloInteger rhs) & {
return *this *= rhs.inv();
}
friend constexpr ModuloInteger operator+(ModuloInteger lhs, ModuloInteger rhs) {
return lhs += rhs;
}
friend constexpr ModuloInteger operator-(ModuloInteger lhs, ModuloInteger rhs) {
return lhs -= rhs;
}
friend constexpr ModuloInteger operator*(ModuloInteger lhs, ModuloInteger rhs) {
return lhs *= rhs;
}
friend constexpr ModuloInteger operator/(ModuloInteger lhs, ModuloInteger rhs) {
return lhs /= rhs;
}
friend constexpr std::istream &operator>>(std::istream &is, ModuloInteger &a) {
i64 v;
is >> v;
a = ModuloInteger(v);
return is;
}
friend constexpr std::ostream &operator<<(std::ostream &os, const ModuloInteger &a) {
return os << a.val();
}
friend constexpr bool operator==(ModuloInteger lhs, ModuloInteger rhs) {
return lhs.val() == rhs.val();
}
friend constexpr bool operator!=(ModuloInteger lhs, ModuloInteger rhs) {
return lhs.val() != rhs.val();
}
};
template <>
int ModuloInteger<int, 0>::Mod = 998244353;
template <>
long long ModuloInteger<long long, 0>::Mod = 4179340454199820289;
constexpr i64 P = 4179340454199820289;
using Z = ModuloInteger<i64, P>;
template <class T>
struct Polynomial : public std::vector<T> {
static std::vector<T> w;
static constexpr auto P = T::getMod();
static void initW(int r) {
if (w.size() >= r) {
return;
}
w.assign(r, 0);
w[r >> 1] = 1;
T s = ::power(T(3), (P - 1) / r);
for (int i = r / 2 + 1; i < r; i++) {
w[i] = w[i - 1] * s;
}
for (int i = r / 2 - 1; i > 0; i--) {
w[i] = w[i * 2];
}
}
constexpr friend void dft(Polynomial &a) {
const int n = a.size();
assert((n & (n - 1)) == 0);
initW(n);
for (int k = n >> 1; k; k >>= 1) {
for (int i = 0; i < n; i += k << 1) {
for (int j = 0; j < k; j++) {
T v = a[i + j + k];
a[i + j + k] = (a[i + j] - v) * w[k + j];
a[i + j] = a[i + j] + v;
}
}
}
}
constexpr friend void idft(Polynomial &a) {
const int n = a.size();
assert((n & (n - 1)) == 0);
initW(n);
for (int k = 1; k < n; k <<= 1) {
for (int i = 0; i < n; i += k << 1) {
for (int j = 0; j < k; j++) {
T x = a[i + j];
T y = a[i + j + k] * w[j + k];
a[i + j + k] = x - y;
a[i + j] = x + y;
}
}
}
a *= P - (P - 1) / n;
std::reverse(a.begin() + 1, a.end());
}
public:
using std::vector<T>::vector;
constexpr Polynomial truncate(int k) const {
Polynomial p = *this;
p.resize(k);
return p;
}
constexpr friend Polynomial operator+(const Polynomial &a, const Polynomial &b) {
Polynomial p(std::max(a.size(), b.size()));
for (int i = 0; i < a.size(); i++) {
p[i] += a[i];
}
for (int i = 0; i < b.size(); i++) {
p[i] += b[i];
}
return p;
}
constexpr friend Polynomial operator-(const Polynomial &a, const Polynomial &b) {
Polynomial p(std::max(a.size(), b.size()));
for (int i = 0; i < a.size(); i++) {
p[i] += a[i];
}
for (int i = 0; i < b.size(); i++) {
p[i] -= b[i];
}
return p;
}
constexpr friend Polynomial operator-(const Polynomial &a) {
int n = a.size();
Polynomial p(n);
for (int i = 0; i < n; i++) {
p[i] = -a[i];
}
return p;
}
constexpr friend Polynomial operator*(T a, Polynomial b) {
for (int i = 0; i < b.size(); i++) {
b[i] *= a;
}
return b;
}
constexpr friend Polynomial operator*(Polynomial a, T b) {
for (int i = 0; i < a.size(); i++) {
a[i] *= b;
}
return a;
}
constexpr friend Polynomial operator/(Polynomial a, T b) {
b = b.inv();
for (int i = 0; i < a.size(); i++) {
a[i] *= b;
}
return a;
}
constexpr Polynomial mulxk(int k) const {
assert(k >= 0);
Polynomial b = (*this);
b.insert(b.begin(), k, 0);
return b;
}
constexpr Polynomial modxk(int k) const {
assert(k > 0);
return Polynomial(this->begin(), this->begin() + k);
}
constexpr Polynomial divxk(int k) const {
assert(k >= 0);
if (this->size() <= k) {
return Polynomial{};
}
return Polynomial(this->begin() + k, this->end());
}
constexpr T whenXis(T x) const {
T ans = T{};
for (int i = (int)this->size() - 1; i >= 0; i--) {
ans = ans * x + this->at(i);
}
return ans;
}
constexpr Polynomial &operator+=(Polynomial b) {
return (*this) = (*this) + b;
}
constexpr Polynomial &operator-=(Polynomial b) {
return (*this) = (*this) - b;
}
constexpr Polynomial &operator*=(Polynomial b) {
return (*this) = (*this) * b;
}
constexpr Polynomial &operator*=(T b) {
return (*this) = (*this) * b;
}
constexpr Polynomial &operator/=(T b) {
return (*this) = (*this) / b;
}
constexpr friend Polynomial operator*(const Polynomial &a, const Polynomial &b) {
if (a.size() == 0 or b.size() == 0) {
return Polynomial();
}
int n = a.size() + b.size() - 1;
int s = 1 << std::__lg(2 * n - 1);
if (((P - 1) & (s - 1)) != 0 or std::min(a.size(), b.size()) < 128) {
Polynomial p(n);
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < b.size(); j++) {
p[i + j] += a[i] * b[j];
}
}
return p;
}
Polynomial f = a.truncate(s);
Polynomial g = b.truncate(s);
dft(f), dft(g);
for (int i = 0; i < s; i++) {
f[i] *= g[i];
}
idft(f);
return f.truncate(n);
}
constexpr Polynomial deriv() const {
int n = this->size();
if (n <= 1) {
return Polynomial();
}
Polynomial p(n - 1);
for (int i = 1; i < n; i++) {
p[i - 1] = i * this->at(i);
}
return p;
}
constexpr Polynomial integr() const {
int n = this->size();
Polynomial p(n + 1);
std::vector<T> _inv(n + 1);
_inv[1] = 1;
for (int i = 2; i <= n; i++) {
_inv[i] = _inv[P % i] * (P - P / i);
}
for (int i = 0; i < n; ++i) {
p[i + 1] = this->at(i) * _inv[i + 1];
}
return p;
}
// assert(this->at(0) != 0);
constexpr Polynomial inv(int m = -1) const {
const int n = this->size();
m = m < 0 ? n : m;
Polynomial p = Polynomial{this->at(0).inv()};
p.reserve(4 * m);
for (int k = 2; k / 2 < m; k <<= 1) {
Polynomial q = Polynomial(this->begin(), this->begin() + std::min(k, n)).truncate(2 * k);
p.resize(2 * k);
dft(q), dft(p);
for (int i = 0; i < 2 * k; i++) {
p[i] = p[i] * (2 - p[i] * q[i]);
}
idft(p);
p.resize(k);
}
return p.truncate(m);
}
constexpr Polynomial ln(int m = -1) const {
m = m < 0 ? this->size() : m;
return (deriv() * inv(m)).integr().truncate(m);
}
constexpr Polynomial exp(int m = -1) const {
m = m < 0 ? this->size() : m;
Polynomial p{1};
int k = 1;
while (k < m) {
k <<= 1;
p = (p * (Polynomial{1} - p.ln(k) + truncate(k))).truncate(k);
}
return p.truncate(m);
}
constexpr Polynomial power(i64 k, int m, i64 k2 = -1) const {
if (0 < k and k <= (1 << 10)) {
Polynomial p = (*this);
Polynomial ans{1};
for (; k; k >>= 1) {
if (k & 1) {
ans *= p;
if (ans.size() > m) {
ans.truncate(m);
}
}
p *= p;
if (p.size() > m) {
p.truncate(m);
}
}
return ans.truncate(m);
}
k2 = k2 < 0 ? k : k2;
int i = 0;
while (i < this->size() and this->at(i) == T{}) {
i++;
}
if (i == this->size() or k * i >= m) {
return Polynomial(m, T{});
}
T v = this->at(i);
Polynomial f = divxk(i) / v;
return (f.ln(m - i * k) * k).exp(m - i * k).mulxk(i * k) * ::power(v, k2);
}
constexpr Polynomial sqrt(int m = -1) const {
m = m < 0 ? this->size() : m;
Polynomial p{1};
int k = 1;
constexpr T INV2 = T(1) / 2;
while (k < m) {
k <<= 1;
p = (p + (truncate(k) * p.inv(k)).truncate(k)) * INV2;
}
return p.truncate(m);
}
friend constexpr std::istream &operator>>(std::istream &is, Polynomial &a) {
int n = a.size();
for (int i = 0; i < n; i++) {
is >> a[i];
}
return is;
}
friend constexpr std::ostream &operator<<(std::ostream &os, const Polynomial &a) {
int n = a.size();
if (n >= 1) {
os << a[0];
}
for (int i = 1; i < n; i++) {
os << ' ' << a[i];
}
return os;
}
};
template <class T>
std::vector<T> Polynomial<T>::w;
using Poly = Polynomial<Z>;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
Poly p(n), q(n);
std::cin >> p >> q;
p *= q;
for (int i = n; i < p.size(); i++) {
p[i - n] += p[i];
}
p.resize(n);
for (int i = 0; i < n; i++) {
i64 x = i64(p[i]);
if (x > P / 2) {
x -= P;
}
std::cout << x << " \n"[i + 1 == n];
}
return 0;
}
这程序好像有点Bug,我给组数据试试?
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3876kb
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: 3572kb
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: 3572kb
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: 3536kb
input:
1 1000000 1000000
output:
1000000000000
result:
ok 1 number(s): "1000000000000"
Test #5:
score: 0
Accepted
time: 527ms
memory: 100028kb
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: 1001ms
memory: 100212kb
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: 1002ms
memory: 99884kb
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: 1006ms
memory: 100008kb
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: 999ms
memory: 100028kb
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: 1024ms
memory: 100128kb
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: 989ms
memory: 100124kb
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: 975ms
memory: 100092kb
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: 977ms
memory: 99880kb
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: 981ms
memory: 100032kb
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: 958ms
memory: 100276kb
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: 969ms
memory: 100208kb
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: 977ms
memory: 100076kb
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: 963ms
memory: 100076kb
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