资源描述:
《acm数论!.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、ACM数论基本模板1.欧几里得求最大公约数,最小公倍数(1)递归的写法:intgcd(inta,intb){returnb?gcd(b,a%b):a;}(2)辗转相除法:intgcd(inta,intb){ if(a
2、na; if((a&1)==0&&(b&1)==0)return2*stein(a>>1,b>>1);//aandbareeven if((a&1)==0)return stein(a>>1,b); //onlyais even if((b&1)==0)return stein(a,b>>1); //onlybis even return stein((a+b)>>1,(a-b)>>1); //aandbareodd}最小公倍数:intlcm(inta,intb){return
3、a/gcd(a,b)*b;}2.扩展欧几里得求ax=b(modm)ax+my=b如果r=gcd(a,m)且b%r==0,则同余方程有解,其最小解为x*(b/r);ax+by=c如r=gcd(a,b),则存在x,y,使xa+yb=r;当x+=b,y-=a后仍然成立 因为xa+yb+ab-ab=r;==>(x+b)a+(y-a)b=rintexgcd(inta,intb,int&x,int&y){ if(b==0){x=1;y=0;returna;} intr=exgcd(b,a%b,y,x); y
4、-=x*(a/b); returnr;}3.素数判定(1)试除法:bool isprime(intn){ inti; for(i=2;i<=(int)sqrt(n*1.0);i++) if(n%i==0) return false; return true;}boolisprime(intn){ if(n==2)returntrue; if(n==1
5、
6、(n&1)==0) returnfalse; for(inti=3;i*i<=n;i+=2) if(n%i==0)returnfals; return
7、true;}(2)miller-rabin算法boolwitness(i64a,i64n){ i64x,d=1,i=ceil(log(n-1.0)/log(2.0))-1; for(;i>=0;i--) { x=d;d=(d*d)%n; if(d==1&&x!=1&&x!=n-1)return1; if(((n-1)&(1<0)d=(d*a)%n; } return d==1?0:1;}boolmiller_rabin(i64n){ if(n==2) return1; if(n==1
8、
9、
10、(n&1)==0)return0; i64j,a; for(j=0;j<50;j++) { a=rand()*(n-2)/RAND_MAX+1; if(witness(a,n))return0; } return1;}另一种写法,更好理解 boolwitness(i64a,i64n){ inti,j=0; i64m=n-1,x,y; while(m%2==0) { m>>=1; j++; } x=pow(a,m,n);///快速幂取模 for(i=1;i<=j;i++) { y=pow(x,2,n);
11、if(y==1&&x!=1&&x!=n-1)returntrue; x=y; } returny==1?false:true;}boolmiller_rabin(i64n){ if(n==2)returntrue; if(n==1
12、
13、n%2==0)returnfalse; for(inti=1;i<=10;i++) { i64a=rand()%(n-1)+1; if(witness(a,n))returnfalse; } returntrue;} 4.素数筛法 //前17个素数prime[18]={17,2
14、,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59}boolf[100002];//保存判断是否是素数的结果,p[i]=1是素数,p[i]=0则不是素数intprime[78499];//保存素数prime[0]为素数的个数voidPRIME(intM){ inti,i2,k; for(i=0;i<=M;i+=2)f[i]=0; for(i=1;i<=M;i+