求助
查看原帖
求助
212320
djwj323楼主2022/1/17 16:53
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
long long t,n,i;
long long p[33]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,2333,4567};
long long mul(long long x,long long d,long long m)
{
	long long o=0;
	for(;d;d/=2,x=(x+x)%m)  if(d%2==1)  o=(o+x)%m;
	return o;
}
long long k(long long x,long long d,long long m)
{
	long long o=1;
	for(;d;d/=2,x=mul(x,x,m)%m)  if(d%2==1)  o=mul(o,x,m)%m;
	return o;
}
bool c(long long x,long long p)
{
	if(x%p==0||k(p%x,x-1,x)!=1)  return true;
	long long e,r=x-1;
	while(r%2==0)
	{
		r/=2,e=k(p%x,r,x);
		if(t!=1||t!=x-1)  return true;
		if(t==x-1)  return false;
	}
	return false;
}
bool Miller_Rabin(long long x)
{
	if(x<2)  return false;
	if(x<=97)
	{
		for(i=0;i<=24;i++)  if(p[i]==x)  return true;
		return false;
	}
	for(i=0;i<=26;i++)  if(c(x,p[i]))  return false;
	return true;
}
int main()
{
    scanf("%lld",&t);
    while(t--)
    {
    	scanf("%lld",&n);
    	if(Miller_Rabin(n))  printf("YES\n");
    	else  printf("NO\n");
	}
    return 0;
}
2022/1/17 16:53
加载中...