本代码在 LibreOJ 被活活卡成了9207ms,不知道为什么
算法:miller_rabbin
用时:9207ms
```cpp
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
long long t, n;
long long ksc(long long x, long long y, long long mod) {
long long sum = 0;
x %= mod;
while (y) {
if (y & 1) {
sum += x;
sum %= mod;
}
x += x;
y >>= 1;
x %= mod;
}
return sum;
}
long long ksm(long long x, long long y, long long mod) {
long long sum = 1;
while (y) {
if (y & 1) {
sum = ksc(sum, x, mod);
}
x = ksc(x, x, mod);
y >>= 1;
}
return sum;
}
bool pd(long long x) {
srand(time(0));
if (x == 1 || x == 0)
return false;
if (x == 2 || x == 3)
return true;
if (!(x & 1))
return false;
long long k = x - 1;
long long r = 0;
while (!(k & 1)) {
++r;
k >>= 1;
}
long long t = 1, lt = 0;
for (int h = 0; h <= 10; h++) {
t = rand() % (n - 1) + 1;
t = ksm(t, k, n);
if (t == 1)
continue;
lt = t;
for (int i = 1; i <= r; ++i) {
t = ksc(t, t, n);
if (t == 1) {
if (lt ^ (n - 1))
return false;
break;
}
lt = t;
}
if (t ^ (1ll))
return false;
}
return true;
}
int main() {
while (scanf("%lld", &n) != EOF) {
if (pd(n)) {
putchar('Y');
} else {
putchar('N');
}
putchar('\n');
}
}