mxqz快速乘莫名出错
查看原帖
mxqz快速乘莫名出错
482642
hank0402楼主2022/9/12 19:32

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;
}
2022/9/12 19:32
加载中...