18.7.12 数论专题总结

今天专题是数论 曾yl大佬给我们讲的 太强了 我要赞美他...!!!

好了进入正题 

今天大概有四个内容 

1.容斥原理    2.欧拉函数

3.同余           4.莫比乌斯函数

进入主题

容斥

 有个口诀 奇加偶减

差不多是这样子 没什么好讲的 上道例题 bzoj1042


这道题可以先用没有限制的背包跑出装满i的容量有多少种方法 用dp[i]表示 

但是每种硬币都有限度 怎么办呢

第i种硬币是不是用di + 1 枚就是超出限制了呀 那么容量为si - ci * (di +1)就是容量超出限制不合法方案数

那么就用dp[s] - dp[si - ci * (di +1)]就好了 以此类推   (需要特判不合法容量是否大于0)

然饿这样是错的...

为什么呢 我们很容易发现方案中会出现1号硬币不合法同时2号也不合法的方案 

我们在减一号不合法方案和二号时减了两次 多减了一次 怎么办呢 加回来就好了啊...

以此类推 就发现这满足容斥原理 就奇加偶减 就好了

使用递归实现加减不好写的容斥原理 


差不多就这。

同余

1.同余的同除性


因为(d,c) = 1 所以d有在模c意义下的逆元(数论倒数)

所以在同余式两边同时乘以d的逆元就好了 而不是两边同时除以d

2.gcd实质

平常我们使用辗转相除法求(a,b) 正确性是因为这个 


使用乘法分配律 将gcd提出来 发现y + x  与 y - x 仍然有这个因子

模就相当于一直减一直减就好了

利用这个 就有了一个常数很小的求gcd的板子


先将x y 都变成奇数 将他们的2提出来 取min就相当于把gcd里的2都提出来

然后再辗转相为此时开始x y 是奇数 肯定没有因子2 但是相减出现了偶数 所以位运算弄掉x身上的2。

3.逆元的线性递推

A[i] 表示i的逆元


证明

≡ 0 (mod p) 将p变成 p / i * i + p % i ≡ 0  令p / i为r ,p % i 为k

有 r * i + k ≡ 0   两边同乘 r k 逆元  (k (-1)) 有 i * k (-1) + r (-1) ≡ 0 

移过去 代回去 得证

4.威尔逊定理 

证法大概是 1 2 3 4 .... p - 1是p的一个完全剩余系  (概念自个儿查去)

然后有个定理是1 ~ p - 1 内只有1 和 p - 1 他们mod p的逆元是他们自己 别的数都可以两两配对

别问我怎么整的 没讲

然后就配对呗.. 配完了就完了

5.费马小定理  (a p 互质)

 

证明

引理 : 给定一个p的最小的完全剩余系(1 2 3 ... p - 1) 这个剩余系里每个元素乘上一个与p互质的数a后仍然是p的一个完全剩余系

证明引理 : 反证法 假设原本剩余系中两元素 k1 k2 乘上a之后余数相同 (即不满足完全剩余系性质)

                则a * k1 - a * k2 ≡ 0  -> a * (k1 - k2)  0 

                因为 a p 互质  且p为质数 那么剩余系里的两个元素k1 k2与p互质 所以k1 - k2 也与p互质 所以不可能≡0 

                假设错误  所以乘上a之后仍然是完全剩余系

所以我们得到了一个新的剩余系 将这两个剩余系自己的所有元素乘起来 显然这两个乘积是同余的

有 1 * 2 * 3 * 4 * .... * (p - 1)  ≡ a ^ (p - 1) * 1 * 2 * 3 * 4 * .... * (p - 1)   (mod p)

显然1 * 2 * 3 * 4 * .... * (p - 1) 与 p 互质

再有同余的同除性两边乘上1 * 2 * 3 * 4 * .... * (p - 1) 的逆元 即有a ^ (p - 1) ≡ 1 (mod p) 得证

6.BSGS 算法 (c is prime,a c 互质)

用处 求解 a ^ x ≡ b (mod c) 的解x

做法

先令j从1 ~  c 预处理出所有的a ^ j mod c 用数字哈希存入一个邻接表中

将这个转化为根号下算法 令m = c 就有x = i * m + j ( 0 <= i <= c)

那么我们就枚举 i 

令D = a ^ (i * m) 有 D * a^j ≡ b (c)  令X = a^j     ->  DX + c * y ≡ b  (c)

这是不是一个同余方程呀! 用exgcd求解即可 求得的X0再用 X0 + k * c / (a,c) 包括所有可行解 

在这样求得最小正整数解 再去hash表中找是否有对应的a ^ j 如果有 就求出来了...

exgcd貌似讲的时候出了点小问题 以后有时间来弄吧..

同余差不多

欧拉函数 概念自个儿查去

先给你三个定理 (zyl大哥手写第三条..)

要求p is prime.

证明定理1

还是比较容易的 因为p是一个质数 那么每隔p个数出现一个p的倍数 只有这个倍数才与p不互质

所以p ^ k 个数里 有 p ^ k / p 个数不与p互质 也就是p ^ (k - 1)

作差得证

证明定理2

首先将n进行质因数分解 n = p1 ^ r1 * p2 ^ r2 ... pk ^ rk (pi是n的因数) 

然后我们需要知道phi函数是一个积性函数 概念自个儿查去

再分别对pi ^ ri 使用定理1 有phi(n) = phi(p1 ^ r1) * phi(p2 ^ r2 )...* phi(pk ^ rk ) = 

p1 ^ r1 * p2 ^ r2 ... pk ^ rk * (1 - 1/p1) * (1 - 1/p2)* ....(1 - 1/pk) 把前面那一大坨代成n 得证

证明定理3  :

我们对1 ~ n的所有数进行分组

我们令cd 为(i,n) = d 的一个集合 |cd|表示这个集合的元素个数

那么我们能保证1 ~ n 里的每一个数都能分且只能分进一组当中

因为(i,n)只有一个且必有(1,n)

满足条件的(i,n) = d 同时除以d   ->  (1 / d,n / d) = 1 这是什么? 是phi(n / d) 啊

也就是说|cd| = phi(n / d) 

并且我们发现每一个i只能分入cd (d | n)的组里 因为d必定是n的因子

所以统计时只需要统计能整除n的d 的|cd|就好了

换句话说 ∑|cd| (d | n) = ∑phi(n / d(d | n)  = (将n / d转化成n的因子d是等价的) = ∑phi(d(d | n) = 

集合中所有元素的个数 = n 

得证

用定理2可以求单个数的phi值

欧拉线性筛 

不多说了只需要知道两个定理

phi(n * m) = phi(m) * phi(n) (m n 互质 n is prime)

phi(n * m) = phi(m) * n (m n 不互质 n is prime 也就是m是n的倍数)


欧拉定理


证明 

首先我们需要知道什么是缩系(既约剩余系) 概念自个儿查去

现在我有一个1 ~ n 的完全缩系(p1 p2 p3 p4 ... pk) 将这个缩系中 每个元素乘上a (a n 互质) 

我们很容易知道若一个数其余数原本与n互质 则它乘上一个与n 互质的数a之后 模n余数仍然与n互质

又因为他原是一个完全剩余系 那么现在肯定还是一个完全剩余系 

(因为元素mod n余数两两不同 证明方法与上述费马小定理中引理的证明相同)

所以将这个缩系里每个元素相乘  由缩系概念可知 缩系元素的个数肯定是phi(n) 即k = phi(n)

有p1 * p2 * p3 * ... pk  p1 * p2 * p3 * ... pk * a ^ k 

又由同余的同除性有 a ^ phi(n) ≡ 1 (mod n)

扩展欧拉定理

别问了我也不会证明 没讲


先写这么多吧 莫比乌斯函数写不完了...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值