• 数论模板 整理


    一、筛法求素数

     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 }
  • 相关阅读:
    121. Best Time to Buy and Sell Stock
    70. Climbing Stairs
    647. Palindromic Substrings
    609. Find Duplicate File in System
    583. Delete Operation for Two Strings
    556 Next Greater Element III
    553. Optimal Division
    539. Minimum Time Difference
    537. Complex Number Multiplication
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6366267.html
Copyright © 2020-2023  润新知