模板 数论

GCD

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 long long gcd(int x,int y){
 5     if(x%y==0) return y;
 6     else return gcd(y,x%y);
 7 }
 8 int main(){
 9     long long M,N;
10     cin>>M>>N;
11     cout<<gcd(M,N)<<endl;
12     return 0;
13 }
14 
15 bigint gcd(bigint x,bigint){
16     // Make sure x>y
17     if(x<=y) swap(x,y);
18     if(y==0) return x;
19     if((x%2==0)&&(y%2==0)) return gcd(x>>1,y>>1)<<1;
20     if(x%2==0) return gcd(x>>1,y);
21     if(y%2==0) return gcd(x,y>>1);
22     return gcd(y,x-y);//Attention!
23 }
gcd
 1 int exGcd(int a,int b,int &x,int &y)  
 2 {  
 3     if(b==0)  
 4     {  
 5         x=1;y=0;  
 6         return a;
 7         // 此时a = gcd(A,B)  
 8         // a * 1 + b * 0 = gcd(A,B)
 9         // 由于b=0,y可以任意取值
10     }  
11     int d=exGcd(b,a%b,y,x); // 注意这里x,y的位置对调  
12         y-=a/b*x;  
13         return d; // 返回最大公约数  
14     }  
15     
16     
17 /*原Gcd*/
18 int gcd(int a,int b)
19 {
20     if(b==0) return a;
21     else     return gcd(b,a%b);
22 } 
exgcd

LCM

 1 #include <iostream>
 2 using namespace std;
 3 /* 欧几里得算法:递归法计算最大公约数 */
 4 long long gcd(long long m, long long n)
 5 {
 6     return (m==0)?n:gcd(n%m, m);
 7 }
 8 
 9 // 计算最小公倍数函数
10 long long lcm(long long a, long long b)
11 {
12    return a/gcd(a,b)*b;
13 }
14 
15 int main()
16 {
17     int a,b;
18     cin>>a>>b;
19     cout<<lcm(a,b)<<endl;
20     return 0;
21 }
lcm

CRT

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int exgcd(int a,int b,int &x,int &y){
 5     if(b==0){
 6         x=1,y=0;
 7         return a;
 8     }
 9     int gcd=exgcd(b,a%b,x,y);
10     int t=x;
11     x=y;
12     y=t-a/b*y;
13     return gcd;
14 } 
15 int CRT(int W[],int B[],int k){//W为按多少排列,B为剩余个数,W>B,k为组数 
16     int x,y,a=0,m,n=1;
17     for(int i=0;i<k;i++) n*=W[i];
18     for(int i=0;i<k;i++) {
19         m=n/W[i];
20         exgcd(W[i],m,x,y);
21         a=(a+y*m*B[i])%n;
22     }
23     if(a>0) return a;
24     else return a+n;
25 }
26 
27 
28 
29 
30 /*以下是longlong版本*/
31 #include<cstdio>
32 #include<iostream>
33 #include<cstring>
34 using namespace std;
35 typedef long long LL; 
36 LL exgcd(LL a,LL b,LL &x,LL &y){
37     if(b==0){
38         x=1,y=0;
39         return a;
40     }
41     int gcd=exgcd(b,a%b,x,y);
42     int t=x;
43     x=y;
44     y=t-a/b*y;
45     return gcd;
46 } 
47 LL CRT(LL W[],LL B[],LL k){
48     LL x,y,a=0,m,n=1;
49     for(int i=0;i<k;i++) n*=W[i];
50     for(int i=0;i<k;i++) {
51         m=n/W[i];
52         exgcd(W[i],m,x,y);
53         a=(a+y*m*B[i])%n;
54     }
55     if(a>0) return a;
56     else return a+n;
57 } 
crt

euler

 1 //直接求解欧拉函数
 2 int euler(int n){ //返回euler(n) 
 3      int res=n,a=n;
 4      for(int i=2;i*i<=a;i++){
 5          if(a%i==0){
 6              res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出 
 7              while(a%i==0) a/=i;
 8          }
 9      }
10      if(a>1) res=res/a*(a-1);
11      return res;
12 }
13 
14 //筛选法打欧拉函数表 
15 #define Max 1000001
16 int euler[Max];
17 void Init(){ 
18      euler[1]=1;
19      for(int i=2;i<Max;i++)
20        euler[i]=i;
21      for(int i=2;i<Max;i++)
22         if(euler[i]==i)
23            for(int j=i;j<Max;j+=i)
24               euler[j]=euler[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出 
25 }
euler

素数筛

1 void shaifa(){
2     for(int i=2;i<=n;i++) 
3         for(int j=2*i;j<=n;j+=i)
4             not_prime[j]=true;
5 } 
6 //nlogn by zhx
nlogn
1 void shaifa(){
2     for(int i=2;i<=n;i++) 
3         if(!not_prime[i])
4             for(int j=2*i;j<=n;j+=i)
5                 not_prime[j]=true;
6 } 
7 //nloglogn by zhx
nloglogn
 1 #include <cstring>
 2 using namespace std;
 3 int prime[1100000],primesize,phi[11000000];
 4 bool isprime[11000000];
 5 void getlist(int listsize)
 6 {
 7     memset(isprime,1,sizeof(isprime));
 8     isprime[1]=false;
 9     for(int i=2;i<=listsize;i++)
10     {
11         if(isprime[i])prime[++primesize]=i;
12          for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++)
13          {
14             isprime[i*prime[j]]=false;
15             if(i%prime[j]==0)break;
16         }
17     }
18 }
线性筛
原文地址:https://www.cnblogs.com/drizzly/p/7689094.html