今天做题的时候发现我一直写的 MR 是假的 /ll /ll
特别是用了那 7 个神秘数
错误示例(写了一年:
ll p[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022};
bool ip(ll n) {
if(n < 2) return 0;
REP(i, 7) {
if(n == p[i]) return 1;
if(n % p[i] == 0) return 0;
if(n < p[i]) return 1;
if(! Miller_Rabin(n, p[i])) return 0;
}
return 1;
}
正确示例:
ll p[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022};
bool ip(ll n) {
if(n < 2) return 0;
REP(i, 7) {
if(n == p[i]) return 1;
if(p[i] % n == 0) continue;
if(n % p[i] == 0) return 0;
if(! Miller_Rabin(n, p[i])) return 0;
}
return 1;
}
错误写法中有些合数因为写了 n < p[i]
被直接跳出没被判到,比如 4033 和 4681
同时注意去掉 n < p[i]
后需要注意加上 if(p[i] % n == 0) continue;
,不然会把一些质数判成合数