RT,之前的模板:
ll ksc(ll x, ll y, ll p) {
ll z = (__int128_t)x / p * y;
ll res = (__int128_t)x * y - (__int128_t)p * z;
return (res + p) % p;
}
然后用到这题上 WA 了。
于是把它改成了:
ll ksc(ll x, ll y, ll p) {
return (__int128_t)x * y % p;
}
然后就过了,球各位大佬解答。
贴以下完整代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T;
ll pr[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};
ll ksc(ll x, ll y, ll p) {
return (__int128_t)x * y % p; //
ll z = (__int128_t)x / p * y;
ll res = (__int128_t)x * y - (__int128_t)p * z;
return (res + p) % p;
}
ll qpow(ll x, ll y, ll p) {
ll res = 1;
while(y) {
if(y & 1ll) res = ksc(res, x, p);
y >>= 1;
x = ksc(x, x, p);
}
return res;
}
bool Miller_Rabin(ll x) {
for(int i = 0; i < 12; ++i) {
ll P = pr[i], x0 = x - 1;
if(x == P) return 1;
if(x < P) return 0;
if(qpow(P, x - 1, x) != 1) return 0;
while(x0 % 2 == 0) {
x0 >>= 1;
ll Pow = qpow(P, x0, x);
if(Pow == x - 1) break;
if(Pow != 1) return 0;
}
}
return 1;
}
int main() {
cin >> T;
while(T --) {
ll hh;
cin >> hh;
string ans = (Miller_Rabin(hh) ? "YES" : "NO");
cout << ans << endl;
}
return 0;
}