数论专题

先搞了一波字符串,是时候到数论了。


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\)的数量,那么显然有
\[ g(k)=\lfloor n^{1/k}\rfloor-1=\sum_{k|i} f(k) \]
那么可以莫比乌斯反演得到
\[ f(k)=\sum_{k|i}\mu(i/k)g(i) \]
于是有
\[ S=-\sum_{i>1} \lfloor n^{1/i}-1\rfloor \mu(i) \]
然后算一下发现
\[ ans=\sum_{i=1}^{60} \lfloor n^{1/i}-1\rfloor \mu(i) \]
可以离线给\(n\)从大到小排序,然后动态维护\(n^{1/i}\),就可以很快做出来了。

听说这题卡精度?\(long\ double\)表示没感觉……

2019.4.16

准备开[NOI2018]屠龙勇士,先总结一下两个知识点。

一看题解才发现自己对数论一无所知

扩展欧几里得算法

\(ax+by=c\)的整数解,保证\(\gcd(a,b)|c\)


\[ g=\gcd(a,b),\frac{c}{g}\times x'=x,\frac{c}{g}\times y'=y \]
则有
\[ ax'+by'=g \]
直接扩欧即可。

然后可以得到
\[ x=x'\times \frac{c}{g}+k\times\frac{b}{g},k\in \text{Z} \]

扩展中国剩余定理

其实就是要快速合并
\[ \begin{cases} x=a_1(\text{mod}\ p_1)\\ x=a_2(\text{mod}\ p_2) \end{cases} \]
该式子等价于
\[ x=a_1+p_1y_1=a_2+p_2y_2\\ p_1y_1=p_2y_2+a_2-a_1\\ g=\gcd(p_1,p_2),s_1=\frac{p_1} g,s_2=\frac{p_2}{g}\\ s_1 y_1=s_2y_2+\frac{a_2-a_1}{g}\\ s_1 y_1=\frac{a_2-a_1}{g}(\text{mod}\ s_2)\\ y_1=inv(s_1,s_2)\frac{a_2-a_1}{g}(\text{mod}\ s_2)\\ y_1=inv(s_1,s_2)\frac{a_2-a_1}{g}+k s_2\\ x=a_1+p_1(inv(s_1,s_2)\frac{a_2-a_1}{g}\% s_2)+k\frac{p_1p_2}{g}\\ x=a_1+p_1(inv(s_1,s_2)\frac{a_2-a_1}{g}\% s_2)\ (\text{mod}\ \frac{p_1p_2}{g}) \]
于是我们成功把它们合并为一个。

(然而还是不懂为什么中间要有个\(\% 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)\)

题目要求经过置换之后仍然不相同的方案数,就是所有合法置换的不动点个数的平均数,也就是
\[ ans=\frac 1 n\sum_f C(f) \]
其中\(n\)是置换的个数。

polya定理

一般情况下,按照burnside引理的做法大力枚举,多半是要TLE的。

然而题目一般只要求旋转之后不同(比如说给一个环涂色),所以我们还有很大的优化空间。

\(n\)为点数,\(k\)为颜色数量,那么可以枚举该置换偏移了\(i\)格,那么就会形成\(\gcd(n,i)\)个环,环上颜色全都相同才是不动点。

也就是说,偏移量为\(i\)时有\(k^{\gcd(n,i)}\)个不动点。

于是就可以得到
\[ \frac 1 n \sum_{i=1}^n k^{\gcd(n,i)}\\ =\frac 1 n \sum_{d|n} k^d \varphi(n/d) \]

洛谷P3307 [SDOI2013]项链

https://www.cnblogs.com/p-b-p-b/p/10773994.html

转载于:https://www.cnblogs.com/p-b-p-b/p/10691713.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值