数论
今年的夏天夏天夏天夏天 还不能算做开始
在我见到你之前都不算做开始
——洛天依《夏天还不算开始》
Tip:本歌荣登 NOI 晚会喵!
数论
除了字符串以外最讨厌的东西。
但是非常非常锻炼思维。
天依宝宝可爱!
一个题
思维难度:\(\color{#FFC116} 黄\) *1500
求十进制为 \(888 \ldots 888\),且是 \(L\) 的倍数的数的最小长度,或判断不存在这样的数。
\(1 \le L \le 2 \times 10^9\)。
感觉好难,这是怎么想到的啊……
考虑这个一坨 \(8\) 的数怎么表示,等价于一坨 \(1\) 的数怎么表示。注意到 \(10^x - 1\) 是一坨 \(9\),所以 \(\frac {10^x - 1} 9\) 就是一坨 \(1\),那么一坨 \(8\) 就可以表示为:
所以题目就是要求满足这个式子的最小 \(x\):
移项可以得到:
但是如果这个转为同余式,可以发现 \(\frac {9L} 8\) 作为模数可能不是整数,这是奇怪的。所以要把 \(8\) 移出去,因为我们并不关心 \(k\) 的具体值,所以可以令 \(k \gets 8k\),原式就可化为:
转化为同余式得到:
于是根据裴蜀定理,如果 \(\gcd(10,9L) \ne 1\) 则无解,否则根据欧拉定理 \(x = \varphi(9L)\) 一定是一个可行解,然后暴力枚举 \(\varphi(9L)\) 的因数就可以找到最小解了。
天依宝宝可爱!
CF632D
思维难度:\(\color{#F39C11} 橙\) *1000
数论还是那种感觉……看到题啥也想不到……但看一眼题解发现非常简单……
注意到要在 \(a\) 中求 \(1 \sim m\) 内每个数的因数个数,但是直接不好做,所以考虑用每个数去筛它的倍数,然后发现啊好简单啊这不红题吗,于是做完了()
天依宝宝可爱!
CF906D
思维难度:\(\color{#F39C11} 橙\) *900
欧拉降幂板子,这下会了。
注意到 \(\varphi\) 的下降是很快的,据说是 log 级别的,所以直接暴力降幂就可以,当 \(p = 1\) 时直接返回 \(0\) 即可。
感觉 AI 非常适合调这种形如「把 a[x] 写成 x」的问题,因为人眼真的看不出来 😃
天依宝宝可爱!
洛谷 P2303
思维难度:\(\color{#FFC116} 黄\) *1400
啊我怎么做过/fad ,我怎么不记得了,现在一点也不会了/ll
据说我们要对这个式子很敏感,要想到统计 \(\gcd(i,n) = x\) 的个数从而算出答案。
那么考虑如何算出 \(1 \sim n\) 内 \(\gcd(i,n) = x\) 的个数,其中 \(x \mid n\)。因为 gcd 为 \(x\) 的时候不好直接统计,但是为 \(1\) 的时候就可以拿欧拉函数做了,所以将原式转化为 \(\gcd(\frac i x , \frac n x) = 1\)。注意到符合条件的 \(i\) 可以表示为 \(kx\),所以原式就变成了 \(\gcd(k , \frac n x) = 1\),而 \(k\) 的取值范围又恰好是 \([1,\frac n x]\),所以就相当于求 \(\varphi(\frac n x)\)。于是就做完了。
天依宝宝可爱!
SPOJ 6488 | Wheel Factorization
思维难度:\(\color{#FFC116} 黄\) *1500
Wheel Factorization,好厉害的筛法。
先拿一个数 \(k\),把 \([1,k]\) 内的质数暴力欧拉筛出来,并且求出哪些数和 \(k\) 互质。
注意到在 \([k+1,2k]\) 内,\(\gcd(i,k) = \gcd(i-k,k)\),也就是说如果 \(i-k\) 和 \(k\) 不互质,那么 \(i\) 一定不是质数。所以在这个长度为 \(k\) 的区间内,就只需要筛 \(\varphi(k)\) 个数了。
在写法上,需要用已经筛出来的质数 \(p_i\) 去筛当前区间 \([l,r]\) 内的质数,不过起点需要从 \(l\) 开始。而且,一个 \(p_i\) 能筛到的最小数为 \(p_i \times p_i\),显然这个数之前的数已经被更小的质数筛掉了。当然只筛 \(p_i\) 的奇数倍也是一个很好的小优化。
时间复杂度显然是 \(O(n \times \frac {\varphi(k)} k)\)。
关于 \(k\) 的取值,要尽可能地让 \(\frac {\varphi(k)} k\) 变小,可以发现 \(k\) 的不同质因子越多越好,所以直接取最小的几个质数的乘积即可。
天依宝宝可爱!
CF1017F
思维难度:\(\color{#F39C11} 橙\) *1000
难点在于上一题给出的筛法,会了之后就特别简单了。
令 \(g(x) = {\rm exlog} _f (x)\),显然 \(g(xy) = g(x) + g(y)\),于是就是要求 \(g(n!)\),于是求出 \(n!\) 中每个质因数出现的次数就可以了,这个是经典问题。
天依宝宝可爱!
洛谷 P4777
思维难度:\(\color{#FFC116} 黄\) *1300
exCRT,好像比 CRT 简单不少。
思路是将同余式两两合并。对于这两个式子:
显然可以转化为:
于是:
移项得到:
发现这是一个可以 exgcd 的形式,于是就可以得到 \(k_1,k_2\) 的一组解,于是就得到了 \(x\) 的一个解 \(x_0\),然后据证明,\(x\) 的通解满足 \(x \equiv x_0 \pmod {{\rm lcm}(m_1 , m_2)}\)。所以两个方程就变成了一个,然后这样挨个合并下去,就得到了答案。
然后 exgcd 板子写挂了,应该是 y-=a/b*x 而不是 y-=x*a/b。。

天依宝宝可爱!
[补]gym 104076 E
思维难度:\(\color{#FFC116} 黄\) *1400
显然是构造,手动模拟一下就能搞出结论来,不过题解给了个神秘数论做法。
显然可以把原序列分成 \(k\) 个块,其中每个块内必须相同,且有 \(n \bmod k\) 个大小为 \(\lceil \frac n k \rceil\) 的块,剩下的是大小为 \(\lfloor \frac n k \rfloor\) 的块。
考虑枚举全为 \(1\) 的块的个数,设较大块选了 \(x\) 个,较小块选了 \(y\) 个,那么根据 \(1\) 的个数为 \(\lceil \frac n 2 \rceil\),则有式子:
发现是 exgcd 的形式,于是解出一组特解 \(x_0 , y_0\),又因为 \(\lceil \frac n k \rceil\) 和 \(\lfloor \frac n k \rfloor\) 是互质的,所以通解为:
因为要求的 \(x,y\) 是有取值范围的,于是可以根据这个取值范围分别求出对应的 \(a\) 的取值范围,然后判断是否有交即可。
因为要用到互质,所以需要特判 \(k \mid n\)。
艹 WA on #2,调不出来不调了 submission
天依宝宝可爱!
CF803F | 莫比乌斯反演
思维难度:\(\color{#F39C11} 橙\) *1000
定义莫比乌斯函数 \(\mu (n)\) 为:
注:有平方因子就是 \(n\) 的某一个质因子出现了 \(>1\) 次。
那么有结论,令 \(f(n),g(n)\) 均为数论函数,那么下面两个式子互为充要条件:
或者:
显然不需要证明。
回到这个题,令 \(f(x)\) 为 gcd \(= x\) 的子序列个数,\(g(x)\) 为 gcd 是 \(x\) 的倍数的子序列个数,则有:
而 \(g(x)\) 是容易算的,令包含因子 \(x\) 的数集为 \(S\),则满足条件的数集一定是 \(S\) 的一个非空子集,即 \(g(x) = 2^{|S|} - 1\)。
反演可得:
线筛 \(\mu\) 然后直接求即可。
天依宝宝可爱!
洛谷 P2261 | 整除分块
思维难度:\(\color{#FE4C61} 红\) *800
依然是直接背结论:
对于式子 \(\lfloor \frac n i \rfloor = \lfloor \frac n j \rfloor\),使得该式子成立的最大 \(j\) 为 \(\left\lfloor \frac n {\lfloor \frac n i \rfloor} \right\rfloor\)。
算法流程(直接搬 oi-wiki 了):

拓展 #1:

拓展 #2:

哦这个题,这个题就是板子。
天依宝宝可爱!
洛谷 P3455
思维难度:\(\color{#F39C11} 橙\) *1000
莫反一下,就是二维数论分块的板子了。
可得式子:
(诶这两个下取整怎么不一样大,恼。
所以最开始直接 \(a,b \gets \lfloor \frac a d \rfloor , \lfloor \frac b d \rfloor\) 就好了。
天依宝宝可爱!
SPOJ 5971
思维难度:\(\color{#FFC116} 黄\) *1500
好厉害的转化。
把 lcm 换成 gcd,有:
但是注意到 \(i\) 和 \(\gcd(i,n)\) 拆不开,所以没法直接莫反,要转化。
注意到 \(\gcd(i,n) = \gcd(n-i,n)\),这样似乎可以把 \(i\) 消掉,尝试化一下,将原式抄一遍再除以二,有:
注意到此处 \(n\) 被提了出来,因为不提出来就没法对称了。
因为分母相等,所以分子可以直接加,于是就变成了:
即:
注意到已经可以直接莫反了,但是在本题下还是不行,因为多测,所以复杂度要乘个 \(T\)。
那直接考虑 \(\gcd(i,n) = d\) 的个数试试,发现是容易求的,式子两边同时除以 \(d\) 可得 \(\gcd(\frac i d , \frac n d) = 1\),那么个数就是 \(\varphi(\frac n d)\)。
所以原式可化为:
令 \(d \gets \frac n d\),可得:
所以直接对于每个 \(d\) 枚举倍数 \(O(n \log n)\) 预处理每个 \(n\) 的答案即可。
天依宝宝可爱!

浙公网安备 33010602011771号