• 模板 数论


    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 }
    线性筛
  • 相关阅读:
    .NET平台下Web树形结构程序设计李洪根
    [总结]Asp.net中的页面乱码的问题
    [原创]Datagrid中绑定DropDownList的例子
    [原创]TreeView的递归问题!FAQ
    [个人]我所有的Email地址!
    心情随笔(一)
    [原创]用JS做的一个打字程序(为网友qixiao)
    [转贴]一个通用的数据分页的存储过程
    [转贴]怎么样写一个XML文件到客户端
    [原创]用JS给DropDownList添加新项!
  • 原文地址:https://www.cnblogs.com/drizzly/p/7689094.html
Copyright © 2020-2023  润新知