ACM常用定理

来源:互联网 发布:vue项目案例 知乎 编辑:程序博客网 时间:2024/05/28 09:33

定理1.费马小定理

费马小定理是数论中的一个重要定理,其内容为: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1) ≡1(mod p) 假如p是质数,且a,p互质,那么 a的(p-1)次方除以p的余数恒等于1。

定理2.模乘法得逆

:对于两个整数a,b,a/b是整数,且a和b除以mod得余数分别为aa,bb,则a/b除以mod得余数为(aa*bb^(-1))%mod,其中b^(-1)是b的逆.

(当(a*b)%mod=1是,我们称a和b互为乘法的逆,即a=b^(-1),b=a^(-1))

相关代码:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. void gcd(LL a,LL b,LL &d,LL &x,LL &y)//拓展欧几里得定理,求ax+by=gcd(a,b)的一组解  
  2. {  
  3.     if(!b){d=a;x=1;y=0;}  
  4.     else{gcd(b,a%b,d,y,x);y-=x*(a/b);}  
  5. }  
  6. LL inv(LL a,LL n)//求得a在模n条件下的逆  
  7. {  
  8.    LL d,x,y;  
  9.    gcd(a,n,d,x,y);  
  10.    return d==1?(x+n)%n:-1;  
  11. }  

推论1:mod为质数,由费马小定理得b^(mod-1)%mod=1-->(b*b^(mod-2))%mod=-1,所以b的逆=b^(mod-2).

对于整数a,b(b<mod),且a/b是整数,则a/b除以mod得余数是(a%mod*b^(-1))%mod-->(a%mod*b^(mod-2))%mod.可用于求分数形式整数的模


定理3.SG定理

组合游戏:一个状态是必败状态当且仅当它的所有后继都是必败状态;一个状态是必胜条件当且仅当它至少有一个后继是必败状态

    组合游戏的和。假设有k个组合游戏G1,G2,...Gk,可以定义一个新游戏,在每个回合中,
当前游戏可以任选一个子游戏Gi进行一次合法操作,而让其他游戏的局面保持不变,不鞥操作的游戏者输。
这个新游戏称为G1,G2,...,G3的和


    SG函数和SG定理。对于任意状态x,定义SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S)表示不在S内的最小非负
整数。SG(x)当且仅当x为必败状态.游戏和的SG函数SG函数等于各子游戏SG函数的Nim和。


    Bouton定理:状态(x1,x2,x3)为必败状态当且仅当x1^x2^x3=0,称为Nim和。可看做SG定理在Nim游戏中的运用

例子:UVALive/LA 5059+UVA 10561+UVA 12293


定理4.pick定理

给定一个顶点均为整点(即坐标为整数的点)的简单多边形,其面积A和内部格点数目I与边上格点数目B的关系式:A=I+B/2-1.


定理5.Lucas定理

    A、B是非负整数,p是质数。AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]。
    则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  mod p同余
    即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) 

例子:poj 3146

定理6.欧拉定理

a^(phi(n))≡1(mod n) (a,n互质), phi(n)是欧拉函数,表示不超过n的且与n互质的数的个数。

例子:hdu3307


定理7.五边形数定理



可用于生成函数(母函数):

(1-x-x^2+x^5+x^7-x^12...)(1+p(1)x+p(2)x^2+p(3)x^3)=1;(整数划分的生成函数为1/∏(1-x^i))

得到p(n)=p(n-1)+p(n-2)-p(n-5)-p(n-7)+...



定理8.柯尼希定理(最小顶点覆盖,二分图匹配,匈牙利算法)

资料源自:http://zh.wikipedia.org/wiki/%E8%A6%86%E7%9B%96_(%E5%9B%BE%E8%AE%BA)

http://baike.baidu.com/link?url=5gWVO-A8T_AUGw21_P85QiijE7T934ecsDq-50f8SMh02Vpd1tIuTSgjD4cS922u

     图G顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点。我们称集合V覆盖了G的边。最小顶点覆盖是用最少的顶点来覆盖所有的边。顶点覆盖数\tau是最小顶点覆盖的大小。
     二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i ∈A,j ∈ B),则称图G为一个二分图。
     无向图G为二分图的充分必要条件是,G至少有两个顶点,且其所有回路的长度均为偶数。
     匈牙利算法:它是一种用增广路径求二分图最大匹配的算法

      http://baike.baidu.com/link?url=1U3pNCTlWDbUG1A-YexAqNo_D_1rpFEKBO7IBcjq7d3_MY7MwhCAxeF5MnXW4O-5

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. int find(int cur)  //判断增广路是否存在  
  2. {    
  3.     int i, k;    
  4.     for(i = 0; i < map[cur].size(); i++)    
  5.     {    
  6.         k = map[cur][i];    
  7.         if(!flag[k])    
  8.         {    
  9.             flag[k] = true;    
  10.             if(pre[k] == -1 || find(pre[k]))    
  11.             {    
  12.                 pre[k] = cur;    
  13.                 return 1;    
  14.             }    
  15.         }    
  16.     }    
  17.     return 0;    
  18. }   

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. for(i = 0; i < n; i++)    
  2.         {    
  3.             memset(flag, falsesizeof(flag));    
  4.             sum += find(i);    
  5.         }    

sum就是最大匹配值。

柯尼希定理是这样一个定理:二分图最小点覆盖的点数=最大匹配数。

poj 3041;poj1422,2239,1422,1325,1719,2594,2195,2446,1904,3342,3216,3020

一个PXP的有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,
且任何一个顶点有且只有一条路径与之关联;(如果把这些路径中的每条路径从它的起始点走到它的终点,
那么恰好可以经过图中的每个顶点一次且仅一次);如果不考虑图中存在回路,那么每条路径就是一个弱连通子集

最小路径覆盖的边数=顶点数n-最大匹配数

最大独立集:在二分图G中,点集合M,M中的各个点都不相连,则称M为G的独立集。M中点个数最多的称为最大独立集

最大独立集=最小路径覆盖=n-最大匹配数

例:(1,3),(3,4),(2,3),对于无向图,可以得到两种二分图:

1.(1-3,4-3,2-3),求得最大匹配为m=1,即为最小顶点覆盖数,最大独立集=n-m

2.(1-3,3-1,4-3,3-4,2-3,3-2),求得最大匹配m=2,即为最小顶点覆盖数*2,最大独立集=n-m/2

有向图:

(1-3,2-3,3-4),最大匹配为m=2,最小路径覆盖=n-m;

0 0