数论专题
先搞了一波字符串,是时候到数论了。
2019.4.11
CF1070A Find a Number
用(i,j)表示数字和为i,余数为j的最短路,那么就是(0,0)到(s,0)的最短路。由于边权为1,直接bfs即可。
代码就不写了。
CF1109E Sasha and a Very Easy Test
显然可以线段树,主要问题在于模数不为质数,可能不存在逆元。
那么可以把模数质因数分解一下,所有a除掉不互质的部分分别搞,剩下的就可以exgcd求逆元了。
exgcd写错调了半年……
CF1034C Region Separation
感觉好神仙啊……是我太菜了吗?
考虑如何判断分成k份是否可行。每一份权值和都是S/k,那么可以一个简单的dfs搞定:每次子树积到S/k就断开,看是否可行。
分析一下,可以看有多少个节点子树权值和为S/k的倍数,如果恰好有k个就可行。
又因为\(\frac{S}{k}|x\Leftrightarrow \frac{S}{\gcd(x,S)}|k\),所以可以直接\(O(n\ln n)\)统计。
然后发现一个重要性质:若分\(t\)次,第\(t\)次分成了\(k_t\)份,那么当且仅当\(k_{t-1}|k_t\)时成立,且方法唯一。
所以再一次\(O(n\ln n)\)做\(dp_{xk}+=dp_k\)即可。
2019.4.12
CF1036F Relatively Prime Powers
认真分析一下,其实就是要求有多少个数可以表示为\(i^k\)的形式,数量记为\(S\),那么\(ans=n-1-S\)。
设\(f(k)\)表示\(\gcd=k\)的数量,\(g(k)\)表示\(k|\gcd\)的数量,那么显然有
那么可以莫比乌斯反演得到
于是有
然后算一下发现
可以离线给\(n\)从大到小排序,然后动态维护\(n^{1/i}\),就可以很快做出来了。
听说这题卡精度?\(long\ double\)表示没感觉……
2019.4.16
准备开[NOI2018]屠龙勇士,先总结一下两个知识点。
一看题解才发现自己对数论一无所知
扩展欧几里得算法
求\(ax+by=c\)的整数解,保证\(\gcd(a,b)|c\)。
令
则有
直接扩欧即可。
然后可以得到
扩展中国剩余定理
其实就是要快速合并
该式子等价于
于是我们成功把它们合并为一个。
(然而还是不懂为什么中间要有个\(\% s_2\),感觉删掉也没有关系?)
2019.4.17
洛谷P4774 [NOI2018]屠龙勇士
https://www.cnblogs.com/p-b-p-b/p/10725611.html
2019.4.26
polya定理
这东西虽然考得不多,但万一考中了我就死了,所以还是学习一下吧。
burnside引理
对于某一种置换\(f\),若一个状态\(S\)经过置换之后不变,就称\(S\)是\(f\)的不动点。记一个置换\(f\)的不动点个数是\(C(f)\)。
题目要求经过置换之后仍然不相同的方案数,就是所有合法置换的不动点个数的平均数,也就是
其中\(n\)是置换的个数。
polya定理
一般情况下,按照burnside引理的做法大力枚举,多半是要TLE的。
然而题目一般只要求旋转之后不同(比如说给一个环涂色),所以我们还有很大的优化空间。
设\(n\)为点数,\(k\)为颜色数量,那么可以枚举该置换偏移了\(i\)格,那么就会形成\(\gcd(n,i)\)个环,环上颜色全都相同才是不动点。
也就是说,偏移量为\(i\)时有\(k^{\gcd(n,i)}\)个不动点。
于是就可以得到