1. 程式人生 > >一些數學小結論(可能會更新)

一些數學小結論(可能會更新)

1.錯排公式

來源:當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數D(n)

推導:

第一步,把第n個元素放在一個位置,比如位置k,一共有n-1種方法;

第二步,放編號為k的元素,這時有兩種情況:

(1)把它放到位置n,那麼,剩下n-2個元素(第n個和第k個已經放好啦),就有D(n-2)種方法

(2)不把它放到位置n,這時,對於這n-1個元素(只有第n個是放好的),有D(n-1)種方法;

綜上得到

D(n) = (n-1) [D(n-2) + D(n-1)]

特殊地,D(1) = 0, D(2) = 1.

應用例題:HDU-2048 神、上帝以及老天爺

2.組合公式

來源:從n個不同元素中取出m(m≤n)個元素的所有組合的個數,叫做從n個不同元素中取出m個元素的組合數。

公式:\textrm{C}_{n}^{m}=\frac{n!}{m!(n-m)!}

性質:\textrm{C}_{n}^{m}=\frac{n!}{m!(n-m)!}=\textrm{C}_{n}^{n-m}

程式碼:

long long int C(int n,int m)
{  
    long long x=1;  
    for(int i=1;i<=m;i++)  
        x=x*(n-i+1)/i;  
    return x;  
}  

3.GCD公式

公式:gcd(a^{m}-b^{m},a^{n}-b^{n})=a^{gcd(n,m)}-b^{gcd(n,m)},\qquad a>b

應用例題:HDU-2685 I won’t tell you this is about number theory

關於這道題多寫一段快速冪

int quickpow(int a,int b){
  int r=1,base=a;
  while(b){
    if(b&1) r*=base; //這裡b&1表示取b二進位制的最末位
    base*=base;
    b>>=1; //這裡>>=表示去掉b的二進位制最後一個位並賦值給b
  }
  return r;
}

4.素數篩選

原理:從2~n,找到一個數(顯然它是一個素數),就刪去它的倍數

注意:僅僅需要i*i<=n即可(對於任何一個小於n的x,如果n不是x的倍數,那麼n肯定也不是n/x的倍數)

int prime[500000];
void choseprime(int n)
{
    prime[1]=prime[2]=0;
    for(int i=2;i*i<=n;i++)
        if(prime[i]==0)
            for(int j=2*j;j<=n;j+=i)
                prime[j]=1;
}

5.尤拉函式

定義:小於n的正整數中與n互質的的數的數目

性質:

1.積性函式:若m、n互質,\varphi (mn)=\varphi(m)\varphi (n)

2.若n是質數p的k次冪,\varphi(n)=p^{k}-p^{k-1}=(p-1)p^{k-1}

思路:

設一個數 A=a_{1}^{x_{1}}\cdot a_{2}^{x_{2}}\cdot \cdots \cdot a_{n}^{x_{n}} ,那麼A的尤拉函式:

phi(A)=a_{1}^{x_{1}-1}\cdot (a_{1}-1)\cdot a_{2}^{x_{2}-1}\cdot (a_{1}-1)\cdot \cdots \cdot a_{n}^{x_{n}-1}(a_{n}-1)

整理這個公式,得到如下公式:

phi(A)=\frac{A\cdot (a_{1}-1)\cdot (a_{2}-1)\cdot \cdots \cdot(a_{n}-1) }{a_{1}\cdot a_{2}\cdot \cdots \cdot a_{n}}

做法:令temp=A,然後每找到一個A的質因子就從temp中除掉一個此因子然後再乘上(該因子-1)

long long int phi(long long int a)
{
    long long int temp = a;
    for(long long int i=2; i*i<=a; i++)
        if(a%i==0)
        {
            while(!(a%i))
                a/=i;
            temp=temp/i*(i-1);
        }
    if(a!=1)
        temp=temp/a*(a-1);
    return temp;
}