【学术】小学没钩蒟蒻球问Miller_Rabin
  • 板块学术版
  • 楼主CrTsIr400
  • 当前回复10
  • 已保存回复10
  • 发布时间2020/6/16 22:53
  • 上次更新2023/11/7 00:30:55
查看原帖
【学术】小学没钩蒟蒻球问Miller_Rabin
121995
CrTsIr400楼主2020/6/16 22:53

#include<bits/stdc++.h>
#define inf ((1<<30)-1)
#define linf ((1<<62)ll-1)
#define LL long long
#define F(i,a,b,c) for(register int i=(a);(b);i=(c))
#define Fu(i,a,b) for(register int i=(a);i<=(b);++i)
#define Fd(i,a,b) for(register int i=(a);i>=(b);--i)
#define Fn(i,a) for(register int i=las[(a)];i;i=nex[i])
#define COND(c) (isprint(c))
int Fl,ch;template<typename t>int in(t&a){a=0;ch=getchar();Fl=1;while(((ch<'0')||(ch>'9'))&&ch!=EOF)Fl=(ch=='-')?-Fl:Fl,ch=getchar();if(ch==EOF)return 0;while((ch>='0')&&(ch<='9'))a=a*10+ch-'0',ch=getchar();a*=Fl;return 1;}template<typename t,typename ...ARGS>int in(t&a,ARGS&...args){return in(a)+in(args...);}
using namespace std;
LL pri[12]={0,2,3,7,61,24251};//46856248255981 
typedef long double lb;
const lb dx=1e-8;
inline LL mul(LL x,LL y,LL mod)
{
	LL tmp=(x*y-(LL)((lb)x/mod*y+dx)*mod);
	return tmp<0?tmp+mod:tmp;
}
inline LL ksm(LL x,LL y,LL mod)
{
	LL ans=1;
	for(;y;ans=(y&1)?mul(ans,x,mod):ans,x=mul(x,x,mod),y>>=1);
}
bool MR(LL n)
{
	if(n==2)return 1;
	if(n<2||n%2==0)return 0;
	LL m=n-1;int cnt=0;
	while(!(m&1))m>>=1,++cnt;
	Fu(i,6,10)pri[i]=rand()%(n-1)+1;
	Fu(i,1,10)
	{
		LL x=ksm(pri[i],m,n),y;
		Fu(j,1,cnt)
		{
			y=mul(x,x,n);
			if(x!=1&&x!=n-1&&y==1)return 0;
			x=y;
		}
		if(y!=1)return 0;
	}
	return 1;
}
int main()
{
	srand((int)time(0)+19260817);
	LL t;
	while(in(t))
	{
		if(MR(t)==1)puts("Y");
		else puts("N");
	}
	return 0;
}
//BY Segment_Tree_Juruo (2020严誉沣)

loj143

禁止无意义回复,顺带谢谢

2020/6/16 22:53
加载中...