數論代碼整理

來源:互聯網
上載者:User

標籤:abs   歐拉   span   turn   nlog   [1]   公約數   www   bool   

數論模板

此處均為代碼,學習出門右轉

一、公約數、公倍數GCD
int gcd(int x,int y){    return !y?x:gcd(y,x%y);}
LCM
int lcm(int x,int y){    return x/gcd(x,y)*y;}
拓展歐幾裡得
int x,y;int ex_gcd(int a,int b){    if(!b){        x=1,y=0;return a;    }    int temp=ex_gcd(b,a%b);    x=y,y=temp-a/b*y;    return temp;}
二、篩素數埃拉托色尼篩法
int cnt,prime[maxn];bool not_pr[maxn];void Get_Prime(int x){    not_pr[1]=1;    for(int i=2;i<=x;++i)        if(!not_pr[i]){            prime[++cnt]=i;            for(int j=i*i;j<=x;j+=i) not_pr[j]=1;        }}
線性篩
int cnt,prime[maxn];bool not_pr[maxn];void Get_Prime(int x){    not_pr[1]=1;    for(int i=2;i<=x;++i){        if(!not_pr[i]) prime[++cnt]=1;        for(int j=1;j<=cnt&&i*prime[j]<=n;++j){            not_pr[i*prime[j]]=1;            if(i%prime[j]==0) break;        }    }}
在\(O(nlogn)\)時間內篩除n以內所有數的素因子
int cnt,prime[maxn],pre[maxn];bool not_pr[maxn];void Get_Prime(int x){    not_pr[1]=1;    for(int i=2;i<=x;++i){        if(!not_pr[i]) prime[++cnt]=i;        for(int j=1;j<=cnt;++j){            if(i*prime[j]>x) break;            not_pr[i*prime[j]]=1,pre[i*prime[j]]=j;            if(i%prime[j]==0) break;        }    }}void Get_Ans(int x){    for(int i=1;i<=x;++i){        printf("%d:",i);        int di=i;        while(di!=1) printf("%d",prime[pre[di]]),di/=prime[pre[di]];    }}
三、求歐拉\(φ\)函數埃拉托色尼篩法
int cnt,prime[maxn],phi[maxn];bool not_pr[maxn];void euler(int x){    for(int i=1;i<=x;++i) phi[i]=i;    for(int i=2;i<=x;++i)        if(!not_pr[i]){            prime[++cnt]=i,phi[i]=i-1;            for(int j=i*i;j<=x;++j){                not_pr[j]=1,phi[j]=phi[j]/i*(i-1);         }     }}
歐拉篩
int cnt,prime[maxn],phi[maxn];bool not_pr[maxn];void euler(int x){    phi[1]=1,not_pr[1]=1;    for(int i=2;i<=x;++i){        if(!not_pr[i]) prime[++cnt]=i,phi[i]=i-1;        for(int j=1;j<=cnt;++j){            if(i*prime[j]>x) break;            not_pr[i*prime[j]]=1;            if(!(i/prime[j])) phi[i*prime[j]]=phi[i]*prime[j];            else phi[i*prime[j]]=phi[i]*(prime[j]-1);        }    }}
四、求逆元單個數求逆元
int x,y;int ex_gcd(int a,int b){    if(!b){        x=1,y=0;return a;    }    int temp=gcd(b,a%b);    x=y,y=temp-a/b*y;    return temp;}int cal(int a,int m){//ax%m==1,求最小的x    int Gcd=gcd(a,m);    if(1%Gcd!=0) return -1;    x*=1/Gcd,m=abs(m);    int ans=x%m;    if(ans<=0) ans+=m;    return ans;}
快速冪求逆元

若\(p\)為質數,\(a^{(p-1)}~ mod ~p=1,a\)的逆元為\(a^{(p-2)}\);若\(p\)不是質數,\(a^{phi[p]} ~mod ~p=1\),\(a\)的逆元為\(a^{phi[p]-1}\)。

線性篩逆元
int inv[maxn];void Get_inv(int x){    inv[1]=1;    for(int i=2;i<=x;++i) inv[i]=(p-p/i)*inv[p%i]%p;}
快速冪快速冪
int qpow(int x,int k){    int a=1;    while(k){        if(k&1) a*=x;        x*=x;        k>>=1;    }    return a;}
取膜快速冪
int powmod(int a,int k,int p){    long long a=1;    while(k){        if(b&1) a=1ll*a*x%p;        x=1ll*x*x%p;        k>>=1;    }    return a;}
組合數
void init_C(){    for(int i=0;i<=n;++i) c[i][0]=1;    for(int i=1;i<=n;++i)            for(int j=1;j<=i;++j)                    c[i][j]+=c[i-1][j-1]+c[i-1][j];}

數論代碼整理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.