//常见模板,64位确定版 longlongmulmod(longlong a, longlong b, longlong mod){ __int128 res = (__int128)a * b % mod; return (longlong)res; }
longlongpowmod(longlong a, longlong e, longlong mod){ longlong res = 1; while (e) { if (e & 1) res = mulmod(res, a, mod); a = mulmod(a, a, mod); e >>= 1; } return res; }
boolisPrime(longlong n){ if (n < 2) returnfalse; for (longlong p : {2,3,5,7,11,13,17,19,23,29,31,37}) { if (n%p == 0) return n==p; } longlong d = n-1, s = 0; while ((d & 1) == 0) d >>= 1, s++; auto check = [&](longlong a) { longlong x = powmod(a, d, n); if (x == 1 || x == n-1) returntrue; for (int r = 1; r < s; r++) { x = mulmod(x, x, n); if (x == n-1) returntrue; } returnfalse; }; for (longlong a : {2,325,9375,28178,450775,9780504,1795265022}) if (a % n && !check(a)) returnfalse; returntrue; }