/*复杂度:Olog(i)
输入:a, i, n
输出: a^i mod n*/
long long pow_mod(long long a, long long i, long long n)
{
if (i == 0)
return 1 % n;
int temp = pow_mod(a, i >> 1, n);
temp = temp * temp % n;
if (i & 1) temp = (long long)temp * a % n;
return temp;
}
<pre name="code" class="cpp">//Miller_Rabin素数测试
bool test(LL n, LL a, LL d)
{
if (n == 2) return true;
if (n == a) return true;
if ((n & 1) == 0) return false;
while (!(d & 1)) d = d >> 1;
LL t = pow_mod(a, d, n);
while ((d != n - 1) && (t != 1) && (t != n - 1)) {
t = t * t % n;
d = d << 1;
}
return (t == n - 1 || (d & 1) == 1);
}
bool isPrime(LL n)
{
if (n < 2) return false;
int a[] = {2, 3, 61};
for (int i = 0; i <= 2; ++i) if (!test(n, a[i], n - 1)) return false;
return true;
}
/*复杂度:Olog(i) 输入:a, i, n 输出: a^i mod n*/long long pow_mod(long long a, long long i, long long n){ if (i == 0) return 1 % n; int temp = pow_mod(a, i >> 1, n); temp = temp * temp % n; if (i