为啥超时?
查看原帖
为啥超时?
1380473
ZY_202301005129楼主2024/8/22 15:12

我采用的是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;
	}
}
2024/8/22 15:12
加载中...