数论模板 整理

一、筛法求素数

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,prime[30010],cnt;
 5 bool is_prime[30010];
 6 void solve(){
 7     for(int i=2;i<=n;i++){
 8         if(is_prime[i]==0)prime[++cnt]=i;
 9         for(int j=1;j<=cnt;j++){
10             if(i*prime[j]>n)break;
11             is_prime[i*prime[j]]=1;
12             if(i%prime[j]==0)break;
13         }
14     }
15 }
16 int main(){
17     scanf("%d",&n);
18     solve();
19     for(int i=1;i<=cnt;i++)
20       printf("%d ",prime[i]);
21 }

(更快的Miller-Rabin 素数判定、AKS素数判定不在此整理)

二、最大公约数

 

 1 int GCD(int x,int y){
 2     if(y==0) return x;
 3     else return GCD(y,x%y);
 4 }
 5 int XXGCD(int x,int y){
 6     if(x<y) swap(x,y);
 7     int temp;
 8     while(y!=0){
 9         temp=x%y;x=y;y=temp;
10     }
11     return x;
12 }// 据清华某犇说 辗转相除法比上边那个跑得快 

 

顺便搞一下扩展欧几里得:

1 int exgcd(int a,int b,int &x,int &y){
2     if(b==0){
3         x=1; y=0;
4         return a;
5     }
6     int ans=exgcd(b,a%b,y,x);
7     y-=a/b*x;
8     return ans;
9 }

POJ2142:

 1 #include <cstdio>
 2 #include <algorithm>
 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 ans=exgcd(b,a%b,y,x);
10     y-=a/b*x;
11     return ans;
12 }
13 int main() {
14     int a=1,b,c,x,y;
15     bool Gavin;
16     while (a || b || c){
17         scanf("%d%d%d",&a,&b,&c);
18         if (!a&&!b&&!c) break; //之前没有加这一句,输入最后的000结束时会继续运行一次,致命错误,被0除。
19         Gavin=0;
20         if(a<b){ 
21         swap(a,b);Gavin=1;
22         }
23         int gcd=exgcd(a,b,x,y);
24         a/=gcd;b/=gcd;c/=gcd;
25         x*=c;y*=c;
26         int t=y/a,x1,y1,x2,y2,ansx,ansy;
27         while(y-a*t<0) t--;
28         x1=abs(x+b*t);y1=abs(y-a*t);
29         t++;
30         x2=abs(x+b*t);y2=abs(y-a*t);
31         if ((x1+y1<x2+y2)||(x1+y1==x2+y2)&&(x1*a+y1*b<x2*a+y2*b))
32          ansx=x1,ansy=y1;
33         else ansx=x2,ansy=y2;
34         if(Gavin) printf("%d %d\n",ansy,ansx);
35         else printf("%d %d\n",ansx,ansy);
36     }
37     return 0;
38 }
View Code

三、快速幂取模

 

void power(int a,int b,int mo){
    long long ans=1;
    for(int i=1;i<=b;i++){
        ans*=a;
        ans%=mo;
    }
}
long long FastPower(int a,int b,int mo){
    long long ans=1;  a%=mo;
    while(b){
        if(b & 1) ans=(ans*a)%mo;// b 此时是奇数
        b >> =1;//  相当于是 b /= 2 ;
        a=(a * a) % mo;
    }
    return ans;
}

 

四、质因数分解

 

 1 #include<cstdio>
 2 int n,a[10010],cnt;
 3 int main()
 4 {
 5     scanf("%d",&n);
 6     for(int i=2;i<=n;i++){
 7         while(n%i==0 && n>0){
 8             a[++cnt]=i;
 9             n/=i;
10         }
11     } 
12     for(int i=1;i<=cnt;i++)
13       printf("%d ",a[i]);
14     return 0;
15 }

 

posted @ 2017-02-04 19:54  浮华的终成空  阅读(164)  评论(0编辑  收藏  举报

Contact with me