数学小结

学习了一个多周的数论和组合数学,脑子好乱的一片,不知道自己到底学了些什么。总结下来,让自己理清头绪,也为了自己以后忘了回头看看好看到自己学了什么。

也希望能帮助那些刚开始学习数论的同学。说实话从百度百科上看了好长时间才看懂下面这些。

组合数学:

1.组合公式:C(M,N)=C(M-1,N-1)+C(M-1,N);

打表代码:

//a[n][m]表示C(n,m),最后打出a[n][m]即可

const int N=100;

int a[N][N];

void init()

{

a[0][0]=0;

for(int i=1;i<=n;i++)

{ a[1][i]=1;a[i][i]=1;a[0][i]=0;


}

for(int i=2;i

        for(int j=2;j

            a[i][j]=a[i-1][j-1]+a[i-1][j];

        }

}

}

2.错位排列:

n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.

第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况:
把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;
k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;(相当于k是从第n的位置上去的元素,
这样就容易想通)


公式D(n)=(n-1)*(D(n-1)+D(n-2));

D(1)=0;

D(2)=1;


3.容斥原理

在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。

都是些概念举个例子

两个集合的容斥关系公式:AB = A+B – A∩B    (∩:重合的部分)

奇数次重合加偶次重合减  刚好不多算;

用的是深搜 我做一个题,题解看了两个半小时好难!看着容易其实代码理解了也是不太难

最重要的就是转化,寻找可以做为a,b这样最基础的部分进行奇数次加偶数次减。

4.卡特兰数

满足:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2)的数就是卡特兰数

void catalan()      //卡特兰数:  
{  
    int i, j;  
    h[0] = 1;  
    for(i = 1; i < 36; i++)  
    {  
        h[i] = 0;  
        for(j = 0; j <= i; j++)  
        {  
            h[i] += h[j] * h[i-j-1];  
        }  
    }  
}  
但是不是很理解能用来做什么,好坑啊百度有一段好长的代码和说明来解释他的来源和用途。


数论:

1.快速幂算法

这个好基础,我暑假就会的。厉害厉害!

a^b

ll quick(int a,int b)

{

int k=a;

ll sum = 1;

while(b)

{

if(b&1)//二进制算会加快速度

sum*=a;

a*=k;

}

}

2.欧拉函数

欧拉函数是正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。

φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,比如12=12*(1-1/2)*(1-1/3)=4

由此就可以得到模板,和打表的模板,我看了好多,花了好长时间得到的也是这么多,还和费马小定理有点混。

/*注释处是使我混淆的地方。欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。

若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。只有一个质因数p,

a^φ(m)≡1(mod m) 当m是质数p时,此式则为:

a^(p-1)≡1(mod m)

即费马小定理。

分享真是个好东西,给别人讲的时候,会顿悟,叫我武林高手。

*/

int eular(int n)
{
    int ret=1,i;
    for(i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            n/=i,ret*=i-1;
            while(n%i==0) n/=i,ret*=i;
        }
    }
    if(n>1) ret*=n-1;
    return ret;
}

3.费马小定理

 假如p是质数,且Gcd(a,p)=1,那么 a(p-1) ≡1(mod p)

4.好难的逆元

乘法逆元,是指数学领域群G中任意一个元素a,都在G中有唯一的逆元a‘,具有性质a×a'=a'×a=e,其中e为该群的单位元。

就像是 乘法中的倒数一样 a*b=1 b为a的倒数  这里a'为a 的逆元

为什么用到乘法逆元?

a/b≡m  a是由好多大的数乘起来的 a不能用long long int表示。a可以乘以b的逆元,分别%m然后乘以b的逆元

b是关于m的逆元 1-m就是群G

int ni(int a,int b)//a关于b的逆元模板
{
    int x=1;
    while(b)
    {
        if(b&1)x=a*x%mod;
       b>>=1;
        a=a*a%mod;
    }
    return x;
}
5.扩展欧几里得

a>b>0 时
设 ax 1+ by 1= gcd(a,b);
bx 2+ (a mod b)y 2= gcd(b,a mod b);

根据朴素的欧几里德原理有 gcd(a,b) = gcd(b,a mod b);

则:ax 1+ by 1= bx 2+ (a mod b)y 2;
即:ax 1+ by 1= bx 2+ (a - [a / b] * b)y 2=ay 2+ bx 2- [a / b] * by 2;
也就是ax 1+ by1 == ay 2+ b(x 2- [a / b] *y 2);
根据恒等定理得:x 1=y 2; y 1=x 2- [a / b] *y 2;
int  exGcd( int  a, int  b, int  &x, int  &y)
{
     if (b==0)
     {
         x=1;y=0;
         return  a;
     }
     int  r=exGcd(b,a%b,x,y);
     int  t=x;x=y;y=t-a/b*y;
     return  r;
}


你可能感兴趣的:(ACM-组合数学,ACM-数论)