我采用的是miller-rabin算法进行素数判定,讲道理不应该超时,运行miller-rabin函数经过测试没有问题,结果讨论帖里里面有个暴力求法没超时,结果我的反而超时?
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n, k;
const ll prime[] = { 2,3,5,7,11,13,17,37 };
ll qmul(ll x, ll y, ll p)
{
ll sum = 0;
while (y)
{
if (y & 1)
sum = (sum + x) % p;
x = (x + x) % p;
y >>= 1;
}
return sum;
}
ll qm(ll a, ll n, ll p)
{
ll sum = 1;
while (n)
{
if (n & 1)
sum = qmul(a, sum, p);
a = qmul(a, a, p);
n >>= 1;
}
return sum;
}
bool mr(ll a, ll p)
{
ll d = p - 1,r=0;
while (!(d & 1))d >>= 1, r++;
int z = qm(a, d, p);
if (z == 1)return 1;
for (int i = 1;i <= r;i++)
{
if (z == p - 1)return 1;
z = qmul(z, z, p);
}
return 0;
}
bool ifprime(ll x)
{
for (int i = 0;i < 8;i++)
{
if (x == prime[i])return 1;
if (x % prime[i] == 0)return 0;
if (!mr(prime[i], x))return 0;
}
return 1;
}
int main()
{
cin >> n >> k;
n++;k++;
if (n > 4)
{
if (k >= n / 2 + 1)
{
if (ifprime(k))
{
cout << 1;
return 0;
}
else
{
cout << 2;
return 0;
}
}
cout << 2;
return 0;
}
else
{
if (n == 4)
{
if (k == 3)cout << 1;
else cout << 2;
}
if (n == 3)cout << 1;
}
}