数论基础的题目

\(CF906D\)

我们先无视区间询问,看一次怎么做。我们求\(a^b(mod\space m)\),本质上就是求\(b\space mod\space \varphi(m)\)。我们对于一个幂塔,就这样一步一步求解即可。

一个重要的性质是,对\(m\)进行\(m=\varphi(m)\)的操作,最多只会进行\(log\space m\)次。因为\(\varphi(m)\)大多情况下是偶数,这样,做一次就除以\(2\),所以是\(log\space m\)次。所以,只有大概前\(log\)项是有用的。

但是,问题是,根据扩展欧拉定理,我们还要知道这个数的真实值是否大于某个数。我们还要维护一个\(number\)。若真实值小就存真实值,否则存\(1e9+1\),维护是简单的。所以在处理到\(mod\space 1\)的那一步时,最好再往后看几项(不看一般也没啥事)。注意细节。

带上区间,我们一样做即可。复杂度\(O(qlog^2p)\)

\(P3747\)

注意到这题的\(c\)是固定的。可以证明,每个数最多操作约\(logp\)次,答案就固定了。于是求出\(p\)不断进行\(\varphi\)操作的序列\(p_i\),对每个数维护它对\(p_i\)取模的结果,以及真实值的大概范围。用并查集的跳过性,再加上树状数组,可以在\(O(nlog^3p+(nlogp+q)logn)\)的复杂度内解决问题,获得\(90\)分。

可以发现复杂度瓶颈在求\(c\)的幂对\(p_i\)取模的结果。于是根号预处理,对于每个\(p_i\),求\(c^i(0\le i\le B)\)\(c^{iB}(0\le i\le 2\times p_{i-1}/B)\)\(p_i\)取模的结果。这样就可以\(O(1)\)\(c\)的幂,在\(O(\sqrt plogp+nlog^2p+(nlogp+q)logn)\)的复杂度内解决,得分\(100\)分。

\(P8688\)

原问题可以转换成,求\(0\le i\le n,0\le j\le i,m\)\((i,j)\)数,减去\(0\le i\le n,0\le j\le m,\binom{i}{j}\ne 0(mod\space p)\)的方案数,这样数位\(dp\)就没那么恶心了。上面是简单的,下面设\(f_{i,0/1,0/1}\)表示处理到前\(i\)位,\(i\)卡/不卡上界,\(j\)卡/不卡上界的方案数。转移是简单的,复杂度\(O(tlogp)\)

\(P3306\)

这题需要高中数学中的数列知识。若\(a=0\),则看\(x_1\)\(b\)等不等于\(t\)即可。若\(a=1\),则\((i-1)b=t-x_1(mod\space p)\)\(b=0\)特判一下,\(b\ne 0\)就除过去,再加上\(1\)即可。若\(a\ge 2\),则进行减不动点法\(x_{i+1}+\frac{b}{a-1}=a(x_i+\frac{b}{a-1})(mod\space p)\)。换\(x_i=x_i+\frac{b}{a-1}\)\(t=t+\frac{b}{a-1}\),则\(x_{i+1}=ax_i(mod\space p)\)。我们要求\(x_1a^{i-1}=t(mod\space p)\)的最小正整数\(i\)。若\(x_1=0\)则特判一下,否则除过去,做\(BSGS\)即可。

\(P12694\)

合数不好做,首先用\(CRT\)分解为\(x^a=b(mod\space p^k)\),最后把方案数乘起来即可。然后是分类讨论:若\(b=0\),则\(x\)必须是\(p^{\lceil k/a\rceil}\)的倍数,方案有\(p^{k-\lceil k/a\rceil}\)。若\(b\)\(p\)的倍数,设含有\(c\)\(p\)。若\(a\nmid c\),方案为\(0\),否则将\(b,p^k\)都除以\(p^c\),转换为\(b,p^k\)互质的情况,最后别忘记乘一个\(p^{c-c/a}\)即可。若\(b,p^k\)互质,则\(x\)\(p^k\)也互质。将\(a\)\(phi=\varphi(p^k)\),设\(x=g^y\)\(m=g^k\),则有解当且仅当存在\(y\)满足\(ay=k(mod\space phi)\),当且仅当\(m^{phi/gcd(a,phi)}=1(mod\space p^k)\)。若有解,则方案数为\(gcd(a,phi)\)。复杂度\(O(Tlog^2p)\)

\(CF1106F\)

\(f_k=x\)。可以用矩阵快速幂求出\(f_n\)\(x\)的几次方,注意模的一定是\(p-1\)。然后就是求\(x^b=m(mod\space p)\)的任意解。这是一个\(n\)次剩余问题,我们用原根来对付它。

我们知道,\(p\)的原根是\(3\)。我们设\(x=3^y\),用\(BSGS\)求出\(m=3^k\)。那原问题有解,当且仅当存在\(y\)满足\(by=k(mod\space p-1)\),所以判定条件为\(gcd(b,p-1)|k\)。然后,设\(g=gcd(b,p-1)\),把\(b,k,p-1\)都除以\(g\)。若\(b=0\),则我们钦定\(y=0\),否则除过去即可。复杂度\(O(k^3logn+\sqrt plogp)\)

posted @ 2025-12-17 16:56  captainOI  阅读(0)  评论(0)    收藏  举报