2018.7.12(初等数论+组合数学)

初等数论

素数

大家都会,略过
就是 O n 的线性筛

素数定理

唯一分解定理

略过

威尔逊定理

p 为素数,则 ( p 1 ) ! p 1 ( m o d p ) 同时,它的逆定理也成立。

费马小定理

p 为素数, a 为正整数, a p 互质,则 a p 1 1 ( m o d p ) 。

欧拉小定理

a φ ( m ) 1 ( mod m ) ,( a m 互质)

欧几里得算法

g c d ( a , b ) = g c d ( b , a m o d b )

扩展欧几里得算法

求解形如ax+by=gcd(a,b)方程的一组解。
当b=0时,原方程的解就是x=1,y=0。
假设 b x + ( a m o d b ) y = g c d ( a , b ) 有解。
b x + ( a a b b ) y = g c d ( a , b )
a y + b ( x a b y ) = g c d ( a , b )
所以我们也找到了原方程的一组解,按照欧几里得算法那样递归求解即可

裴蜀定理

a , b 是整数,且 g c d ( a , b ) = d ,那么对于任意的整数 x , y , a x + b y 都一定是d的倍数,特别地,一定存在整数 x , y ,使 a x + b y = d 成立。
推广:n个整数, a 1 , a 2 , a 3 . . . . . . a n 为n个整数, d 是它们的最大公约数,那么存在整数 x 1 . . . . . . x n 使得 x 1 a 1 + x 2 a 2 + . . . x n a n = d

逆元

O ( n ) 递推
O ( l o g n ) 求单个数的逆元

中国剩余定理

很显然略过

Baby Step Giant Step(BSGS)

用于求解方程 A x m o d P = B (P为质数)
m = p
x = i m + j
原式转化为 A i m + j B m o d p
A i m B A 1 j
左边枚举 i 丢进 h a s h
右边枚举 j 去与 h a s h 表对应

扩展BSGS

显而易见的,BSGS需要求逆元,也就是要求 g c d ( A , P ) = 1
也就是说, g c d ( A , P ) 1 时,不能用BSGS。
对于方程 A B m o d P = C ,假设 d = g c d ( A , P ) ,若 d | C 不成立(特殊条件 B = 1 暂不考虑),方程无解。
改写原方程
A d × A B 1 C d ( m o d P d )
后面任然用BSGS

大数分解

大数分解:将n分解为质因数的积的形式(n可能很大,O(√n)算法无法完成)
大数分解给人的第一感觉:玄学
P o l l a r d R h o 算法:
1.找到一个数p,使得 p | n ,将 n 分解为 p n / p
2.如果 p n / p 不是素数,继续递归;
3.如果是素数,记录并退出。

大数分解有两个关键:
第一个是如何判定一个数是不是素数。
这里我们用到了 M i l l e r R a b i n 算法:
设我们要判定的数是 p ,如果存在一个底数 a ,使得 a p 1 1 ( m o d p ) 不成立,那么 p 肯定不是质数。
随机几次,出错率就比较低了。
为了使出错率更低,还有二次探测的方法。
如果 p 是奇素数,则 x 2 1 ( m o d p ) 的解为 x = 1 x = p 1 ( m o d p )
对于奇素数 r × 2 s + 1 r 为奇数),一般对 a r a r 2 ,…, a ( r 2 s 1 ) 进行二次探测。

另一个是如何找 p 使得 p | n
1.找到一个数 p 1
2.通过某种玄学手段得到与 p 1 对应的一个数 p 2
3.判断 | p 2 p 1 | 是否能整除 n ,即 g c d ( | p 2 p 1 | , n ) 是否大于1;
4.如果大于 1 g c d ( | p 2 p 1 | , n ) 即为所求,否则 p 2 作为一个新的 p 1 ,继续重复上述过程。
实际使用中,一般用如下公式进行推导: p 2 = ( p 1 2 + c ) m o d n ,其中c为随机常数。这个公式能保证在形成环之前, p 2 p 1 基本不会相等。
如何判断是否形成环:标记i位于1,标记j位于2,标记i随着过程不断++,碰到标记j后,标记j的位置*2,并记录当前标记i处的值,这样能保证当j-i>环的大小时,一定能找到环。碰到环了就直接退出,换一个随机常数再找。

一些例题

压惊水题

给定一个长度为n的数组,求ai|aj这样的数对(i,j)有多少个?
n , a i <= 10 6
其实只要枚举每一个数组中的数及其他们的倍数就行了
O ( n l o g n )

BZOJ1477 青蛙的约会

exgcd裸题
x + a n s m y + a n s n ( m o d L )
x y a n s ( n m ) ( m o d L )
剩下扩欧好了

#include<bits/stdc++.h>
using namespace std;
long long x,b,a,y,m,n,l,t,d,ans;
int ex_gcd(long long &x,long long &y,long long a,long long b)
{
    if(!b) return x=d/a,y=0;
    ex_gcd(x,y,b,a%b),t=x;
    return x=y,y=t-a/b*y;
}
int main() 
{
    scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l);
    d=(y-x+l)%l;
    a=(m-n+l)%l;
    b=l;
    long long a1=a,b1=b;
     while(b1)
     {
       t=b1;
       b1=a1%b1;
       a1=t;    
     }
    if(d%a1==0)
     {
      ex_gcd(ans,y,a,b);
      while(ans<0) ans=(ans+l)%l;
      printf("%lld",ans%l);
     }
    else 
     printf("Impossible");
    return 0;
}

BZOJ2257 瓶子和饮料

给定n个瓶子的容量,选出其中k个,最大化k个瓶子之间无度量所能表达的最小体积。
k n 1000 10 9
实际上是答案就是 k 个瓶子体积的 g c d
枚举所有的质因子判断一下是否出现次数超过 k 即可
O ( n m a x ( V ) )
https://blog.csdn.net/a1035719430/article/details/81055790

BZOJ2818 GCD

当然是莫比乌斯反演啦
好啦,N这么小怎么可能毒瘤莫比乌斯呢
莫比乌斯可以优化我们这题的做法做到更优
其实我们只要枚举 g c d = p ,然后 ( x , y ) 可以等价到 ( x g c d ( x , y ) , y g c d ( x , y ) )
也就是我们只要在 [ 1 , N p ] 之间直接统计答案即可

BZOJ4173数学

这题还真是鬼畜….
我们也可以鬼畜,打表出答案 φ ( n ) φ ( m ) n m
我们考虑证明
第二个 Σ 中的( n m o d k + m m o d k k )等价于
n + m k n k m k = 1
将原式转化
这里写图片描述
那么原式答案就为 φ ( n ) φ ( m ) n m

其实打表是很好的,只要打表后面那个 Σ 就可以愉快AC了

bzoj3122随机数生成器

如果高中数列你学的没问题你可以很轻松的写出通项公式
蓝后你就可以得到形如: d = ( b c + t ) ( x 1 + b c ) 1 的式子了
BSGS!

组合数学

加法原理&乘法原理

略过

排列组合

公式略过
经典例题
某保密装置须同时使用若干把不同的钥匙才能打开。现有7人,每人持若干钥匙。须4人到场,所备钥匙才能开锁。问①至少有多少把不同的钥匙?②每人至少持几把钥匙?
解析:
①每3人至少缺1把钥匙,且每3人所缺钥匙不同。故至少共有C(7,3)=35把不同的钥匙。
② 任一人对于其他6人中的每3人,都至少有1把钥匙与之相配才能开锁。故每人至少持C(6,3)=20把不同的钥匙。

可重复的排列

如果S是一个多重集,它有K个不同的类型元素,各元素分别为 n 1 , n 2 , , n k 个,那么,S的全排列个数为 n ! n 1 ! n 2 ! n k !

可重复的组合

设S是一个具有k种类型元素的多重集,每种元素均具有无限的重复数.则S的r-组合数为C(r+k-1,r).
例题简单略过

二项式定理

( x + y ) n = k = 0 n C n n k x n k y k
对照杨辉三角理解
特殊情况:
( 1 + x ) n = k = 0 n C n n k x k

组合数性质

C n r = C n n r
显然

C n r = C n 1 r + C n 1 r 1
显然

k = 0 r C n + k k = C n + r + 1 r
略微证明:
C n 0 = C n + 1 0
C n 0 + C n + 1 1 + C n + 2 2 + + C n + r r
= C n + 2 1 + C n + 2 2 + + C n + r r
= C n + 3 2 + + C n + r r
= C n + r + 1 r
证毕

C n l × C l r = C n r C n r l r
显然

k = 0 n C n k = 2 n
一句话证明:将 x = 1 带入二项式定理

k = 0 n ( 1 ) k × C n k = 0
一句话证明:将 x = 1 带入二项式定理

C m + n r = k = 0 r C m k × C n r k
显然

C m + n m = k = 0 m C m k × C n k
一句话证明:用 C n r = C n n r 将每一项的左边(含m的组合数)变换一下即转化为前一个式子

k × C n k = n × C n 1 k 1
左右展开即可

k = 0 n 2 C n 2 × k = k = 0 n 2 1 C n 2 × k + 1 = 2 n 1
简要证明:
首先由前面我们可以知道 k = 0 n C n k = 2 n
k = 0 n ( 1 ) k × C n k = 0
式子2告诉我们前面两项相等,式子1告诉我们两项都是 2 n 1

k = 1 n k × C n k = n × 2 n 1
证明:将k的每一项通过 k × C n k = n × C n 1 k 1 换一下
变换得 n × k = 1 n C n 1 k 1
k = 0 n C n k = 2 n
原式 = n × 2 n 1

k = 1 n k 2 × C n k = n × ( n + 1 ) × 2 n 2
证明:
将⑼ k × C n k = n × C n 1 k 1 左右同乘 k 1 再化简
k ( k 1 ) C n k = n ( n 1 ) C n 2 k 2
然后原始就好处理了。
原式 = k = 1 n ( k 2 k ) C n k + k = 1 n C n k
= k = 1 n n ( n 1 ) C n 2 k 2 + n × k = 1 n C n 1 k 1
= n ( n 1 ) × 2 n 2 + n × 2 n 1
= n ( n + 1 ) × 2 n 2

k = 0 n ( C n k ) 2 = C 2 n n
证明:
对于⑻ C m + n m = k = 0 m C m k × C n k
m = n 即可得到原式

( 1 + x ) n 1 + x n ( m o d n )
一句话证明:二项式定理拆开,中间的部分都包括因子n

组合数取模

n 1000 m 1000
直接上杨辉三角
C ( n , m ) = C ( n 1 , m 1 ) + C ( n 1 , m )

n 10 5 m 10 5 ,p是素数(比n和m大)
预处理阶乘以及阶乘的逆元

n 10 9 m 10 9 p 10 5 且为素数。
L u c a s 定理
C(n,m)=C(n%p,m%p)*C(n/p,m/p)
C n m = C n $ $ m o d $ $ p m $ $ m o d $ $ p
只需要递归处理 C n p m p \一部分即可。
L u c a s 定理的证明:
C n m 就是 ( 1 + x ) n x m 项的系数
n = a p + b , m = c p + d
( 1 + x ) a p + b = ( ( 1 + x ) p ) a ( 1 + x ) b = ( 1 + x p ) a ( 1 + x ) b
所以 ( 1 + x ) a p + b x c p + d 项的系数就是 C a c × C n d

n 10 9 m 10 9 p = p 1 c 1 p 2 c 2 p k c k p i c i 10 5
对于不同的 p i c i ,我们可以用中国剩余定理定理解决
现在主要的问题就是对 p i c i 取模。
C n m 表示为 k × p i x ,就可以解决问题了。

Catalan数

非线性递推关系
h ( n + 1 ) = k = 2 n h ( k ) h ( n k + 2 )
( n 3 ) h ( n ) = ( n / 2 ) [ h ( 3 ) h ( n 1 ) + h ( 4 ) h ( n 2 ) + . . . . . . h ( n 2 ) h ( 4 ) + h ( n 1 ) h ( 3 ) ] .
线性递推关系
h ( n + 1 ) = [ ( 4 n 6 ) / n ] h ( n ) .
组合式
h ( n + 1 ) = C ( 2 n 2 , n 1 ) / n .

Fibonacci数

性质:
F ( 1 ) + F ( 2 ) + + F ( n ) = F ( n + 2 ) 1
F 2 ( 1 ) + F 2 ( 2 ) + + F 2 ( n ) = F ( n ) F ( n + 1 )
F ( 1 ) + 2 F ( 2 ) + + n F ( n ) = n F ( n + 2 ) F ( n + 3 ) + 2
F ( 1 ) + F ( 3 ) + + F ( 2 n 1 ) = F ( 2 n )
F ( 2 ) + F ( 4 ) + + F ( 2 n ) = F ( 2 n + 1 ) 1
均可通过数学归纳法证明

一一对应

将一个复杂问题转化为另一个对应的简单问题,使得两者的所有情况一一对应;或者将一个不熟悉、冗余的问题转化为一个熟悉、清晰的问题。这是我们解题的重要思路和思考方法

prufer编码

假定已知的n个顶点标志为1,2,…,n,假定T是其中的一棵树,叶节点中有标号最小者。设为a1,a1的邻接点为b1,从T中消去点a1和边(a1,b1)。再从余下的树T1中寻找标号最小的叶节点,设为a2,a2的邻接点为b2,从从T1中消去点a2和边(a2,b2)。如此步骤n-2次,直到最后剩下一条边为止。于是一棵树T对应一序列{b1,b2,…,bn-2},这些数是1~n中的数,并且允许重复。

反过来从b1,b2…bn-2可以恢复树T本身

在序列(1)中找出第一个不出现在序列(2)中的数,这个数显然便是a1,同时形成边(a1,b1),并从(1)中消去a1,从(2)中消去b1。在余下的(1)和(2)中继续以上的步骤n-2次,直到序列(2)为空集为止。这时序列(1)中剩下的两个数x,y,边(x,y)就是树T的最后一条边

Prufer编码指的就是序列 b 1 , b 2 , . . . , b n 2

Prufer编码的一个重要性质:一个节点的度数为d,那么它在Prufer序列中出现的次数为d-1。

容斥原理

[ D e M o r g a n 定理]
这里写图片描述
拓展
这里写图片描述

一般形式
这里写图片描述

应用
证明欧拉函数
这里写图片描述
证明错排问题
这里写图片描述

猜你喜欢

转载自blog.csdn.net/a1035719430/article/details/81021651
今日推荐