社区讨论

采用和题解几乎完全一样的代码,结果还是错了?

SP288PON - Prime or Not参与者 6已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@m03n3xz3
此快照首次捕获于
2024/08/21 17:17
2 年前
此快照最后确认于
2024/08/21 20:01
2 年前
查看原帖
为什么?
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
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(sum,a,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++;
	ll z = qm(a, d, p);
	if (z == 1)return 1;
	for (int i = 0;i < r;i++)
	{
		if (z == p - 1)return true;
		z = qmul(z,z,p);
	}
	return false;

}
void solve()
{
	long long x;cin >> x;
	if (x <= 1)
	{
		cout << "NO"<<"\n";
		return;
	}

	for (int i = 0;i < 8;i++)
	{
		if (x == prime[i])
		{
			cout << "YES" << "\n";
			return;
		}
		if(x%prime[i]==0)
		{
			cout << "NO" << "\n";
			return;
		}
		if (!mr(prime[i],x))
		{
			cout << "NO" << "\n";
			return;
		}
	}
	cout << "YES"<<"\n";
	return;
}
int main()
{
	int t;cin >> t;
	while (t--)
		solve();
}

回复

7 条回复,欢迎继续交流。

正在加载回复...