一些數學小結論(可能會更新)
阿新 • • 發佈:2019-02-10
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個元素的組合數。
公式:
性質:
程式碼:
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公式
公式:
應用例題: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互質,
2.若n是質數p的k次冪,
思路:
設一個數 ,那麼A的尤拉函式:
整理這個公式,得到如下公式:
做法:令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;
}