QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#91705 | #249. Miller Rabin 算法 | zghtyarecrenj# | AC ✓ | 482ms | 12796kb | C++14 | 7.4kb | 2023-03-29 13:54:36 | 2023-03-29 13:54:39 |
Judging History
answer
#include <bits/stdc++.h>
typedef unsigned long long u64;
template<typename T, typename UT> class montctx_t {
private:
typedef T val_t;
typedef UT mval_t;
static const int tlen = sizeof(val_t) * 8;
public:
val_t mdn, mdn2, p2, r;
montctx_t(val_t x): mdn(x), mdn2(x << 1), p2(-mval_t(mdn) % mdn), r(1) {
for (int i = 1; i < tlen; i <<= 1)
r *= 2 + r * mdn;
}
inline val_t redc(mval_t x)const {
return (x + (val_t(x) * r) * mval_t(mdn)) >> tlen;
}
inline val_t redu(val_t x)const {
return x >= mdn2 ? x - mdn2 : x;
}
inline val_t reds(val_t x)const {
return x >= mdn ? x - mdn : x;
}
};
//# 30 31
typedef montctx_t<uint32_t, uint64_t> montctx32_t;
//# 62 63
typedef montctx_t<uint64_t, unsigned __int128> montctx64_t;
//# 30 62
template<typename T, typename UT> class mont_t {
private:
typedef T val_t;
typedef UT mval_t;
static montctx_t<T, UT> ctx;
val_t v;
public:
static montctx_t<T, UT> getctx() {
return ctx;
}
static void setctx(const montctx_t<T, UT> &x) {
ctx = x;
}
explicit operator val_t()const {
return ctx.reds(ctx.redc(v));
}
mont_t(val_t x) {
v = ctx.redc(x * (mval_t)ctx.p2);
}
mont_t() {}
mont_t(const mont_t &a): v(a.v) {}
mont_t &operator+=(const mont_t &a) {
v = ctx.redu(v + a.v);
return*this;
}
mont_t &operator-=(const mont_t &a) {
v = ctx.redu(v - a.v + ctx.mdn2);
return*this;
}
mont_t &operator*=(const mont_t &a) {
v = ctx.redc(v * (mval_t)a.v);
return*this;
}
mont_t &operator=(const mont_t &a) {
v = a.v;
return*this;
}
mont_t operator+(const mont_t &a)const {
return mont_t(*this) += a;
}
mont_t operator-(const mont_t &a)const {
return mont_t(*this) -= a;
}
mont_t operator*(const mont_t &a)const {
return mont_t(*this) *= a;
}
mont_t operator-()const {
mont_t r;
r.v = (v ? ctx.mdn2 - v : 0);
return r;
}
bool operator==(const mont_t &a)const {
return ctx.reds(v) == ctx.reds(a.v);
}
bool operator!=(const mont_t &a)const {
return !(*this == a);
}
friend std::istream &operator>>(std::istream &s, mont_t &v) {
val_t tmp;
s >> tmp;
v = mont_t(tmp);
return s;
}
friend std::ostream &operator<<(std::ostream &s, const mont_t &v) {
return s << val_t(v);
}
};
//# 30
typedef mont_t<uint32_t, uint64_t> mont30_t;
template<> montctx32_t mont30_t::ctx = montctx32_t(998244353);
//# 62
typedef mont_t<uint64_t, unsigned __int128> mont62_t;
template<> montctx64_t mont62_t::ctx = montctx64_t(998244353);
//# 31 63
template<typename T, typename UT> class mont_e_t {
private:
typedef T val_t;
typedef UT mval_t;
static montctx_t<T, UT> ctx;
val_t v;
public:
static montctx_t<T, UT> getctx() {
return ctx;
}
static void setctx(const montctx_t<T, UT> &x) {
ctx = x;
}
explicit operator val_t()const {
return ctx.reds(ctx.redc(v));
}
mont_e_t(val_t x) {
v = ctx.reds(ctx.redc(x * (mval_t)ctx.p2));
}
mont_e_t() {}
mont_e_t(const mont_e_t &a): v(a.v) {}
mont_e_t &operator+=(const mont_e_t &a) {
v = ctx.reds(v + a.v);
return*this;
}
mont_e_t &operator-=(const mont_e_t &a) {
v = ctx.reds(v - a.v + ctx.mdn);
return*this;
}
mont_e_t &operator*=(const mont_e_t &a) {
v = ctx.reds(ctx.redc(v * (mval_t)a.v));
return*this;
}
mont_e_t &operator=(const mont_e_t &a) {
v = a.v;
return*this;
}
mont_e_t operator+(const mont_e_t &a)const {
return mont_e_t(*this) += a;
}
mont_e_t operator-(const mont_e_t &a)const {
return mont_e_t(*this) -= a;
}
mont_e_t operator*(const mont_e_t &a)const {
return mont_e_t(*this) *= a;
}
mont_e_t operator-()const {
mont_e_t r;
r.v = (v ? ctx.mdn - v : 0);
return r;
}
bool operator==(const mont_e_t &a)const {
return v == a.v;
}
bool operator!=(const mont_e_t &a)const {
return !(*this == a);
}
friend std::istream &operator>>(std::istream &s, mont_e_t &v) {
val_t tmp;
s >> tmp;
v = mont_e_t(tmp);
return s;
}
friend std::ostream &operator<<(std::ostream &s, const mont_e_t &v) {
return s << val_t(v);
}
};
//# 31
typedef mont_e_t<uint32_t, uint64_t> mont31_t;
template<> montctx32_t mont31_t::ctx = montctx32_t(998244353);
//# 63
typedef mont_e_t<uint64_t, unsigned __int128> mont63_t;
template<> montctx64_t mont63_t::ctx = montctx64_t(998244353);
//#
const int N = 5;
u64 n;
struct mat {
mont63_t a[N][N];
};
mat *I, *P, *Q;
inline void MatMul(mat *A, mat *B, mat *C) {
for (int i = 0; i < N; ++i)
for (int j = i; j < N; ++j) {
C->a[i][j] = 0;
for (int k = 0; k < N; ++k)
C->a[i][j] += A->a[i][k] * B->a[k][j];
if (i != j)
C->a[j][i] = C->a[i][j];
}
}
inline mat QuickPow(mat *R, u64 n) {
mat mre = *R, mbb = *I, mt = *I;
mat *re = &mre, *bb = &mbb, *t = &mt;
while (n > 0) {
if (n & 1) {
MatMul(bb, re, t);
std::swap(t, bb);
}
n >>= 1;
MatMul(re, re, t);
std::swap(t, re);
}
return *bb;
}
bool isP(mat *x, mat *y) {
for (int i = 0; i < N; ++i)
if (x->a[i][i] != y->a[i][i] + 1)
return 0;
for (int i = 0; i < N; ++i)
for (int j = i + 1; j < N; ++j)
if (x->a[i][j] != y->a[i][j])
return 0;
return 1;
}
void init_mat() {
I = new mat({1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0,
0, 0, 0, 0, 1});
P = new mat({ 1, 2, 5, 11, 37,
2, 1, 17, 31, 13,
5, 17, 1, 23, 7,
11, 31, 23, 1, 3,
37, 13, 7, 3, 1 });
Q = new mat({ 0, 2, 5, 11, 37,
2, 0, 17, 31, 13,
5, 17, 0, 23, 7,
11, 31, 23, 0, 3,
37, 13, 7, 3, 0 });
}
int main() {
while (scanf("%llu", &n) != EOF) {
if (n == 1) {
puts("N");
continue;
}
if (n <= 100) {
bool flg = 1;
for (int i = 2; i * i <= n; ++i)
if (n % i == 0) {
flg = 0;
break;
}
puts(flg ? "Y" : "N");
continue;
}
if (n % 2 == 0) {
puts("N");
continue;
}
mont63_t::setctx(montctx64_t(n));
init_mat();
mat PP = QuickPow(P, n), QQ = QuickPow(Q, n);
//for (int i = 0; i < N; ++i, printf("\n"))
// for (int j = 0; j < N; ++j) printf("%llu ", PP.a[i][j]);
//for (int i = 0; i < N; ++i, printf("\n"))
// for (int j = 0; j < N; ++j) printf("%llu ", QQ.a[i][j]);
puts(isP(&PP, &QQ) ? "Y" : "N");
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 405ms
memory: 12240kb
input:
996581938833575363 971646509461160317 773155992127361153 161603952726515268 540879144500456953 476831214764178553 784255927154201144 671096087619405061 805545190025269709 339546334309245137 337726347922962343 222956293307015293 809183111090275843 799050063298926344 691718101820598109 646220213113313...
output:
N Y Y N Y Y N Y Y Y Y Y Y N Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y N Y Y N Y Y Y Y Y Y Y N Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y ...
result:
ok 15000 lines
Test #2:
score: 0
Accepted
time: 435ms
memory: 12796kb
input:
292094793288448159 456918231632780153 52701684901220791 755430520029564023 202037556396478813 224321375550698537 953758266735232253 68668310674613297 730895589897264853 344428227893888993 521429852982590257 547788290718839273 332181270020381261 876010276438312333 906474115171090099 26200832832269134...
output:
N N Y N N N Y N Y N N N N N Y N Y N Y Y N Y Y N Y N Y N Y N Y N N Y N Y Y Y N N Y N Y Y Y N N N Y N N Y Y N N N N Y N N N N N Y Y N N N N N Y N Y Y Y N N Y N Y N Y N N Y Y N N N N Y Y N Y N N N N Y Y Y N Y N N Y N N Y Y Y Y Y Y Y N Y N N N Y N N N Y N Y N N Y N N N Y Y Y N Y Y Y N Y N N N Y N Y N Y ...
result:
ok 15000 lines
Test #3:
score: 0
Accepted
time: 360ms
memory: 12352kb
input:
37686301288201 83818601792630641 73103085605161 146313732835525609 228087610722516540 343255869017446321 132173451449926849 461798530935794823 171613522570639321 746139393134794441 700705956080852569 186402586980996590 116687280644971921 439801455648601 608187424599317161 582838391995869241 29815648...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #4:
score: 0
Accepted
time: 405ms
memory: 12788kb
input:
37524996401344453 37525085907733993 37525091397104033 37525113078950641 37525124589187073 37525157683455557 37525199043948023 37525222109877577 37525226953298221 37525259363784397 37525364799923431 37525368433484977 37525385480376751 37525430877893551 37525482942628141 37525493960687851 375255005943...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #5:
score: 0
Accepted
time: 430ms
memory: 12692kb
input:
723245739019682401 723245866706340671 723246090945604561 723246352143004873 723246673219734913 723246738513052561 723247420392785287 723247522177775827 723247614067685477 723247698405894889 723247738890989761 723247925881512769 723248063125197301 723248128083366901 723248342755190227 723248614316335...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #6:
score: 0
Accepted
time: 471ms
memory: 12692kb
input:
971250844965384127 971250976411543033 971251162664749381 971251210275610351 971251238585098507 971251326624493501 971252030784923551 971252481632318471 971252499214789069 971252658880954081 971252709089043401 971252873506894229 971252918907625009 971253322904807251 971253706688543701 971254502032321...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #7:
score: 0
Accepted
time: 457ms
memory: 12760kb
input:
975097371418148287 975097379018158177 975098272399702153 975098914621552381 975098941416760309 975098970409909507 975099970219316947 975100563136905217 975100597682316769 975100651225654537 975100655012759497 975101039821060699 975101068247058001 975101132634439177 975101316642410317 975101700693099...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #8:
score: 0
Accepted
time: 455ms
memory: 12692kb
input:
978972814118579281 978972937612021549 978973242843932981 978974480980701913 978974489577710953 978974589631755737 978974652838559653 978974658221459201 978974733332204561 978974806453119673 978975038338417369 978975110530630693 978975222405387461 978975882983990251 978975989516617181 978976060640390...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #9:
score: 0
Accepted
time: 442ms
memory: 12744kb
input:
982815691526899273 982816054071509621 982817060169508141 982817430437283641 982817460181693753 982817461596064513 982817485076790919 982817582130019357 982817899620348031 982818063245540321 982818404515863917 982818922902003769 982818962551574209 982819103882371901 982819366081816363 982819443060395...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #10:
score: 0
Accepted
time: 482ms
memory: 12748kb
input:
986654079350625311 986654424121995397 986654475796632901 986654694060905039 986655094343402881 986655789507565913 986655796720217821 986655894969286081 986656845736427113 986656893630525577 986656899715648481 986656967546105017 986656981419420361 986657020079418001 986657751538639291 986657836955081...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #11:
score: 0
Accepted
time: 444ms
memory: 12760kb
input:
990506396486037061 990506434942654297 990506583343038737 990506633090169007 990506821692002869 990507338152078781 990507642857678513 990509266701009901 990509413103916829 990509672526354901 990509839077929941 990509905448558701 990509948480836033 990509955041980081 990510051552449809 990510327054720...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #12:
score: 0
Accepted
time: 441ms
memory: 12760kb
input:
994436482283245501 994436834643112771 994437438334877633 994438185016980251 994438518667870537 994438572113239849 994439331088447063 994440181755753253 994440412354207381 994440486375543241 994440532681357841 994440572217582901 994440737643657637 994441422312035101 994441492070689121 994441676618381...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #13:
score: 0
Accepted
time: 186ms
memory: 7620kb
input:
998325346159240081 998325547301434393 998326073288529899 998326268408182393 998326321136886799 998326462535387389 998327440063121761 998327468968116311 998327968547706001 998328232689759721 998328353036363983 998328398641461907 998328773289179851 998329620625002751 998329775152828861 998329853754818...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 6507 lines
Test #14:
score: 0
Accepted
time: 153ms
memory: 9816kb
input:
100052803951001600 105728860800000000 893853530276283200 6455400775964240 685235886664718720 793482962376918720 758221361453121056 37589855997724840 1128108118059 895139368646464000 483432966915053800 237004108121200000 22178 645282657277920000 813367395538094000 1136069149644000 281785329587500000 ...
output:
N N N N N N N N N N N N N N N N N N N N N N Y N N N N N N N Y N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 100000 lines
Test #15:
score: 0
Accepted
time: 230ms
memory: 8200kb
input:
7355283904579708 340900868429664088 409813708555172383 798303077978606212 933070571813959595 847644669042501513 846257476787352 234597331314353867 277585039133688524 851204170596626165 594596242764549240 572350511563954970 192135875262875110 246494444316739512 758894357303160432 816417381374096460 2...
output:
N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N Y N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N Y N N N N N N N N N N N N N N N N N N N N N N N N N N N ...
result:
ok 15000 lines
Test #16:
score: 0
Accepted
time: 388ms
memory: 12672kb
input:
905692770808102913 930028507424096257 949143104756121601 980147206984040449 937502850030764033 995429930529636353 932948810307469313 998400035831171009 975907589757296641 937838365703667713 993888142765326337 952675423299305473 959231186122371073 919613148026621311 915833125114740737 993893747187972...
output:
Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y N N Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y N Y Y N Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y ...
result:
ok 15000 lines
Test #17:
score: 0
Accepted
time: 55ms
memory: 8096kb
input:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 ...
output:
N Y Y N Y N Y N N N Y N Y N N N Y N Y N N N Y N N N N N Y N Y N N N N N Y N N N Y N Y N N N Y N N N N N Y N N N N N Y N Y N N N N N Y N N N Y N Y N N N N N Y N N N Y N N N N N Y N N N N N N N Y N N N Y N Y N N N Y N Y N N N Y N N N N N N N N N N N N N Y N N N Y N N N N N Y N Y N N N N N N N N N Y N ...
result:
ok 15000 lines
Test #18:
score: 0
Accepted
time: 132ms
memory: 12348kb
input:
909135097259562682 2 3 5 300914172140004765 27586772282676268 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 891808273166161048 398971097954225213 113 127 131 137 139 149 151 4213617320640392 157 278453033236925382 163 167 173 179 181 712815938968127718 191 193 197 ...
output:
N Y Y Y N N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N N Y Y Y Y Y Y Y N Y N Y Y Y Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y N Y N Y Y Y Y Y Y Y N Y N Y Y Y Y Y Y Y Y Y Y N Y Y N Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N Y Y Y Y Y Y Y Y ...
result:
ok 15000 lines