• 数论模板 整理


    一、筛法求素数

     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
    ",ansy,ansx);
    35         else printf("%d %d
    ",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 }
  • 相关阅读:
    tr的最后一个td
    Jquery的parent方法,这里只讲parent方法
    js判断字符串包含字符串的方法 | 标签包含文本
    js中substring和substr的用法
    一个由印度人编写的VC串口类
    VS2010编译Qt5.4.0静态库
    QT5.4关联VS2010,配置VAssistX关联Qt类
    iOS 关于tableView中有多个textField,输入框被遮住的解决方法
    iOS 之URL schemes
    iOS 之改变状态栏颜色
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6366267.html
Copyright © 2020-2023  润新知