萌新刚学 Miller_Rabin,WA 0pts 求调
查看原帖
萌新刚学 Miller_Rabin,WA 0pts 求调
592238
Elairin176楼主2023/1/20 10:33
//Code by __dest__ruct__or__(uid=592238)
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
#define umap unordered_map
#define ll long long
#define pii pair<int,int>
#define pll pair<long long,long long>
namespace mySTL{
	inline int max(int a,int b){return a>b?a:b;}
	inline int min(int a,int b){return a<b?a:b;}
	inline int abs(int a){return a<0?-a:a;}
	inline int read(){char c=getchar();int f=1,ans=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
	return ans*f;}
	inline long long readll(){char c=getchar();long long f=1,ans=0;
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9')ans*=10,ans+=c-'0',c=getchar();
	return ans*f;}
	inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
	inline void write(int x){if(x<0){putchar('-');x=-x;}
	if(x>=10){write(x/10);}putchar(x%10+'0');}
	inline void writell(long long x){if(x<0){putchar('-');x=-x;}
	if(x>=10){writell(x/10);}putchar(x%10+'0');}
	inline ll pw(ll a,ll b,ll p){if(b==0)return 1;
	if(b==1)return a;
	ll mid=pw(a,b/2,p)%p;
	if(b&1)return mid*mid%p*a%p;else{return mid*mid%p;}}
}
using namespace mySTL;
const int cnt=25,prime[25]={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};
inline ll exmul(ll n,ll m,ll p){
	ll ans=0;
	while(m>0){
		if(m&1){
			ans=(ans+n)%p;
		}
		m>>=1;
		n=(n+n)%p;
	}
	return ans;
}
inline ll expow(ll n,ll m,ll p){
	ll ans=1;
	while(m>0){
		if(m&1){
			ans=exmul(ans,n,p);
		}
		m>>=1;
		n=exmul(n,n,p);
	}
	return ans;
}
inline bool Miller_Rabin(ll x){
	if(x<2){
		return false;
	}
	if(x==2){
		return true;
	}
	for(int i=0;i<cnt;i++){
		if(x==prime[i]){
			return true;
		}
		ll a=((rand()<<16)|rand())%(x-1)+1;
		if(expow(a,x,x)!=a){
			return false;
		}
	}
	for(int i=0;i<cnt;i++){
		ll a=prime[i]%(x-1)+1;
		if(expow(a,x,x)!=a){
			return false;
		}
	}
	return true;
}
int t;
ll n;
int main(void){
	//freopen("data.txt","r",stdin);
	srand(time(0));
	t=read();
	while(t--){
		n=readll();
		if(Miller_Rabin(n)){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	return 0;
}

是在 Miller_Rabin 的过程出错了吗?
求大佬讲解

2023/1/20 10:33
加载中...