数论

今年的夏天夏天夏天夏天 还不能算做开始

在我见到你之前都不算做开始

——洛天依《夏天还不算开始》

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\) 就可以表示为:

\[8 \times \frac {10^x - 1} 9 \]

所以题目就是要求满足这个式子的最小 \(x\)

\[kL = 8 \times \frac {10^x - 1} 9 \]

移项可以得到:

\[k \times \frac {9L} 8 = 10^x - 1 \]

但是如果这个转为同余式,可以发现 \(\frac {9L} 8\) 作为模数可能不是整数,这是奇怪的。所以要把 \(8\) 移出去,因为我们并不关心 \(k\) 的具体值,所以可以令 \(k \gets 8k\),原式就可化为:

\[k \times 9L = 10^x - 1 \]

转化为同余式得到:

\[10^x \equiv 1 \pmod {9L} \]

于是根据裴蜀定理,如果 \(\gcd(10,9L) \ne 1\) 则无解,否则根据欧拉定理 \(x = \varphi(9L)\) 一定是一个可行解,然后暴力枚举 \(\varphi(9L)\) 的因数就可以找到最小解了。

天依宝宝可爱!


CF632D

思维难度:\(\color{#F39C11} 橙\) *1000

数论还是那种感觉……看到题啥也想不到……但看一眼题解发现非常简单……

注意到要在 \(a\) 中求 \(1 \sim m\) 内每个数的因数个数,但是直接不好做,所以考虑用每个数去筛它的倍数,然后发现啊好简单啊这不红题吗,于是做完了()

submission

天依宝宝可爱!


CF906D

思维难度:\(\color{#F39C11} 橙\) *900

欧拉降幂板子,这下会了。

注意到 \(\varphi\) 的下降是很快的,据说是 log 级别的,所以直接暴力降幂就可以,当 \(p = 1\) 时直接返回 \(0\) 即可。

感觉 AI 非常适合调这种形如「把 a[x] 写成 x」的问题,因为人眼真的看不出来 😃

submission

天依宝宝可爱!


洛谷 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)\)。于是就做完了。

submission

天依宝宝可爱!


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\) 的不同质因子越多越好,所以直接取最小的几个质数的乘积即可。

submission

天依宝宝可爱!


CF1017F

思维难度:\(\color{#F39C11} 橙\) *1000

难点在于上一题给出的筛法,会了之后就特别简单了。

\(g(x) = {\rm exlog} _f (x)\),显然 \(g(xy) = g(x) + g(y)\),于是就是要求 \(g(n!)\),于是求出 \(n!\) 中每个质因数出现的次数就可以了,这个是经典问题。

submission

天依宝宝可爱!


洛谷 P4777

思维难度:\(\color{#FFC116} 黄\) *1300

exCRT,好像比 CRT 简单不少。

思路是将同余式两两合并。对于这两个式子:

\[\begin{cases} x \equiv a_1 \pmod {m_1} \\ x \equiv a_2 \pmod {m_2} \end{cases} \]

显然可以转化为:

\[\begin{cases} x = a_1 + k_1 m_1 \\ x = a_2 + k_2 m_2 \end{cases} \]

于是:

\[a_1 + k_1 m_1 = a_2 + k_2 m_2 \]

移项得到:

\[k_1 m_1 - k_2 m_2 = a_2 - a_1 \]

发现这是一个可以 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。。

submission

天依宝宝可爱!


[补]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\),则有式子:

\[\lceil \frac n k \rceil x + \lfloor \frac n k \rfloor y = \lceil \frac n 2 \rceil \]

发现是 exgcd 的形式,于是解出一组特解 \(x_0 , y_0\),又因为 \(\lceil \frac n k \rceil\)\(\lfloor \frac n k \rfloor\) 是互质的,所以通解为:

\[\begin{cases} x = x_0 + a \times \lfloor \frac n k \rfloor \\ y = y_0 - a \times \lceil \frac n k \rceil \end{cases} \]

因为要求的 \(x,y\) 是有取值范围的,于是可以根据这个取值范围分别求出对应的 \(a\) 的取值范围,然后判断是否有交即可。

因为要用到互质,所以需要特判 \(k \mid n\)

艹 WA on #2,调不出来不调了 submission

天依宝宝可爱!


CF803F | 莫比乌斯反演

思维难度:\(\color{#F39C11} 橙\) *1000

定义莫比乌斯函数 \(\mu (n)\) 为:

\[\mu (n) = \begin{cases} 1 & n = 1 \\ 0 & n~含有平方因子 \\ (-1)^k & k~为~n~的质因子个数 \end{cases} \]

注:有平方因子就是 \(n\) 的某一个质因子出现了 \(>1\) 次。

那么有结论,令 \(f(n),g(n)\) 均为数论函数,那么下面两个式子互为充要条件:

\[\begin{aligned} g(n) & = \sum _{d \mid n} f(d) \\ f(n) & = \sum _{d \mid n} \mu(d) g(\frac n d) \end{aligned} \]

或者:

\[\begin{aligned} g(n) & = \sum _{n \mid d} f(d) \\ f(n) & = \sum _{n \mid d} \mu(\frac d n) g(d) \end{aligned} \]

显然不需要证明。

回到这个题,令 \(f(x)\) 为 gcd \(= x\) 的子序列个数,\(g(x)\) 为 gcd 是 \(x\) 的倍数的子序列个数,则有:

\[g(x) = \sum _{x|d} f(d) \]

\(g(x)\) 是容易算的,令包含因子 \(x\) 的数集为 \(S\),则满足条件的数集一定是 \(S\) 的一个非空子集,即 \(g(x) = 2^{|S|} - 1\)

反演可得:

\[f(1) = \sum _{d=1} ^V \mu(d) g(d) \]

线筛 \(\mu\) 然后直接求即可。

submission

天依宝宝可爱!


洛谷 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:

哦这个题,这个题就是板子。

submission

天依宝宝可爱!


洛谷 P3455

思维难度:\(\color{#F39C11} 橙\) *1000

莫反一下,就是二维数论分块的板子了。

可得式子:

\[\sum _{i=1} ^{\min( \lfloor \frac a d \rfloor , \lfloor \frac b d \rfloor )} \mu(i) \left\lfloor \frac a {id} \right\rfloor \left\lfloor \frac b {id} \right\rfloor \]

(诶这两个下取整怎么不一样大,恼。

所以最开始直接 \(a,b \gets \lfloor \frac a d \rfloor , \lfloor \frac b d \rfloor\) 就好了。

submission

天依宝宝可爱!


SPOJ 5971

思维难度:\(\color{#FFC116} 黄\) *1500

好厉害的转化。

把 lcm 换成 gcd,有:

\[\sum _{i=1} ^n \frac {i \cdot n} {\gcd(i,n)} \]

但是注意到 \(i\)\(\gcd(i,n)\) 拆不开,所以没法直接莫反,要转化。

注意到 \(\gcd(i,n) = \gcd(n-i,n)\),这样似乎可以把 \(i\) 消掉,尝试化一下,将原式抄一遍再除以二,有:

\[\frac 1 2 \left( \sum _{i=1} ^{n-1} \frac {i \cdot n} {\gcd(i,n)} + \sum _{i=1} ^{n-1} \frac {(n-i) \cdot n} {\gcd(n-i,n)} \right) + n \]

注意到此处 \(n\) 被提了出来,因为不提出来就没法对称了。

因为分母相等,所以分子可以直接加,于是就变成了:

\[\frac 1 2 \sum _{i=1} ^{n-1} \frac {n^2} {\gcd(i,n)} + n \]

即:

\[\frac 1 2 \sum _{i=1} ^n \frac {n^2} {\gcd(i,n)} + \frac n 2 \]

注意到已经可以直接莫反了,但是在本题下还是不行,因为多测,所以复杂度要乘个 \(T\)

那直接考虑 \(\gcd(i,n) = d\) 的个数试试,发现是容易求的,式子两边同时除以 \(d\) 可得 \(\gcd(\frac i d , \frac n d) = 1\),那么个数就是 \(\varphi(\frac n d)\)

所以原式可化为:

\[\frac 1 2 \sum _{d \mid n} \frac {n^2 \varphi(\frac n d)} {d} + \frac n 2 \]

\(d \gets \frac n d\),可得:

\[\frac n 2 \sum _{d \mid n} \phi(d) \cdot d + \frac n 2 \]

所以直接对于每个 \(d\) 枚举倍数 \(O(n \log n)\) 预处理每个 \(n\) 的答案即可。

submission

天依宝宝可爱!

posted @ 2025-08-19 09:50  little__bug  阅读(9)  评论(0)    收藏  举报