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 }
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 }
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 }
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 }
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 }
素数筛
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
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
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 }