袁師兄數論模板

來源:互聯網
上載者:User

1、求最大公約數,最小公倍數;
int gcd(int x, int y){
   if( 0==y ) return x;
   else return gcd( y, x%y );
}

int lcm(int x, int y){
   return x/gcd(x,y)*y;
}

 

2、素數篩選
//篩選法計算素數;最大範圍1000000;
#define maxn 1000000  //計算範圍;
bool isprime[maxn+10]; //標記是否為素數;
int prime[78500]; //記錄素數;
void Prime(){
   int i,i2,k;
   for(i=1;i<=maxn+2;i+=2) isprime[i]=1,isprime[i-1]=0;
   for(i=3;i<1000;i+=2){ 
       if( isprime[i] == 1 ) {
           i2=i+i, k=i*i;
           while(k<=maxn) isprime[k]=0,k+=i2;
       }
   }
   isprime[1]=0; isprime[2]=1; prime[1]=2; k=1;
   for(i=3;i<=maxn;i+=2)
       if(isprime[i]==1) prime[++k]=i;
   prime[0]=k;   //printf("k=%d\n",k);  
}

/*
迴圈結束點  計算範圍   素數個數
40          1000       prime[0]=168;
100         10000      prime[0]=1229;
           50000      prime[0]=5311;
320         100000     prime[0]=9592;
1000        1000000    prime[0]=78498;
*/

 

3、模數運算
6 % 3 = 0;
19 % 10 = 9;
模數運算對 +, -, * 法具有封閉性,對除法不具有封閉性;
(x*y) % mod <==> (x%mod) * (y%mod) // 注意優先順序;
(x+y) % mod <==> (x%mod) + (y%mod)
(x-y) % mod <==> (x%mod) - (y%mod) 
// (76578908 * 28495857)% 107
《==》(76578908 % 107) *(28495857 % 107)  ;

 

4、素因子分解
定理:  任意一個數(>1)可以唯一表示成若干個素因子的乘積;

60 = 2*2*3*5;

//整數的素因子分解, 不事先計算出素數,不儲存因子冪;
//範圍Maxn<=MAX_INT; 2147483647;
//2*3*5*7*11*13*17*19=9699690; 8個素因子;
//2*3*5*7*11*13*17*19*23=223092870; 9個素因子;

int fac[10]; //記錄素因子;
void Divide(int x){
   1int i,j,facnum=0;
   for(i=2; i*i<=x; i++){
       if( x%i==0 ){
           while( x%i==0 ) x=x/i;
           fac[++facnum]=i;
       }
   }
   if(x!=1) fac[++facnum]=x;
   fac[0]=facnum;
}
// 1000000007;
X = A*B;  if( x%A==0 ) x%B==0;
60 = 5*12; 

//整數的素因子分解並儲存因子冪;不事先計算出素數;
//範圍Maxn<=MAX_INT; 2147483647;

60 = 2*2*3*5;
60 = 2^2 * 3^1 * 5^1;

int fac[10]; //記錄素因子;
int tnum[10]; //記錄素因子的冪;
void Divide(int x){
   int i,facnum=0;
   for(i=2; i*i<=x; i++){
       if(x%i==0){
           int s=0;
           while(x%i==0) x=x/i, s++;
           fac[++facnum]=i, tnum[facnum]=s;
       }
   }
   if(x!=1) fac[++facnum]=x, tnum[facnum]=1;
   fac[0]=tnum[0]=facnum;   //可以分解到的因子個數;
}

 

5、歐拉函數
一個數n,[1,n-1]內與之互素(最大公約數是1)的數的個數;比如 n= 8,那麼 1, 3, 5, 7,這些數與之互素所以 euler[8]= 4;
如果一個數p是素數,則 euler[p]= p-1;

比如這一題:
http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=10166#problem/D
(第五場比賽的題)

當然如果先預先處理出素數的話,也可以求歐拉函數,會更快!
int Euler(int x){
   int i,tmp=x;
   for(i=1; i<=prime[0] && prime[i]*prime[i]<=tmp; i++){
       if( tmp%prime[i]==0 ) {
           x-= (x/prime[i]);
       while( tmp%prime[i] == 0 ) tmp/= prime[i];
       }
   }
   if(tmp>1) x-= x/tmp;
   return x;
}

 

6、整數快速冪,矩陣快速冪;
這是重點,

http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=9834#problem/K (整數快速冪的講解和標誌代碼,注釋)


http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=9323#problem/D (矩陣快速冪的講解和標誌代碼,注釋)
不懂的來問,一定要看代碼和講解,注釋,網上代碼雜了,先看懂這兩份再說了,當然看不看是自己的事;

3^12:  3*3*3*3....
3*3 = 9
3*3*3*3 = 9*9  = 81;
3^4 * 3^4 = 81*81;

7、約瑟夫環問題
http://acm.hust.edu.cn:8080/judge/contest/view.action?cid=10166#problem/E

 

8、擴充歐幾裡德
a*x + b*y = 1; 可以得到這個方程的一個特解;
int Ext_gcd(int a,int b,int &x,int &y){
   if(b==0) { x=1, y=0; return a; }
   int res= Ext_gcd(b,a%b,y,x);
   y-= a/b*x;
   return res;
}

 

9、逆元
(a*b) = 1 (mod m),即 (a*b) % m = 1,
說明b是a對模數為m的逆元,a是b對模數為m的逆元;
記為inv[a].這等價於 a*inv[a]=k*p+1  ,k<a
例如 2*9%17=1, 2的逆元是9,9的逆元是2(mod p), 如果gcd(a,p)=1,則a的逆元存在. 以下設 gcd(a,p)=1;
逆元是積性函數,即 inv[ab] =inv[a]*inv[b];

當除法遇到模數運算時,要用到,比如求 (x/y)%m 的結果,
實際是求 ( x * Inv(y, m) ) % m;
求a對模m的逆元模版,如果返回-1,則逆元不存在;
int Inv(int a,int m){
   int d,x,y;
   d= Ext_gcd(a,m,x,y);
   if(d==1) return (x%m+m)%m;
   return -1;
}

10、若干數列
Fib數列,卡特蘭數列,第二類stirling數……
http://www.cnblogs.com/liushang0419/archive/2011/10/06/2199722.html

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.