又来到令人痛苦的latex环节了
P1082 同余方程
板子题,没什么好说的
这道题既是求同余方程,也是求逆元
板子如下:
long long gcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}else
{
long long k=gcd(b,a%b,x,y);
swap(x,y);
y-=(a/b)*x;
return k;
}
}
P1516 青蛙的约会
设两只青蛙跳跃aaa次后相遇
x+ma≡=y+na(mod L)x+ma\equiv=y+na(mod\;L) x+ma≡=y+na(modL)
ma−na≡y−x(mod L)ma-na\equiv y-x(mod\;L) ma−na≡y−x(modL)
(m−n)a≡y−x(mod L)(m-n)a\equiv y-x(mod\;L) (m−n)a≡y−x(modL)
m,n,x,ym,n,x,ym,n,x,y都是已知常量,接下来我们就可以愉快套板子了
值得注意的是,m−nm-nm−n可能是一个负数,这时便需交换两只青蛙的值
P1292 倒酒
说实话,我觉得这题至少得评绿,楼上一板子题还是绿呢…
总而言之,这道题的思想还是很巧妙的
由PaP_{a}Pa最小这一限制可知在a不满的时候就把a里面的酒倒出来是一种 傻逼透顶 没有价值(无法使答案最小,却会使PaP_{a}Pa白白增大)的行为
又因为PbP_{b}Pb也要尽量最小,所以结束是b酒杯中一定是空的。
综上,我们可以写出下面的式子
Pb×b−Pa×a=ansP_{b}\times b-P_{a}\times a=ans Pb×b−Pa×a=ans
若要让ansansans最小,则ans=gcd(Pa,Pb)ans=gcd(P_{a},P_{b})ans=gcd(Pa,Pb)
我们让Pa,PbP_{a},P_{b}Pa,Pb同除于ggg,此时Pa,PbP_{a},P_{b}Pa,Pb互质
接下来,我们就可以写出
Pb×b−Pa×a=gcd(Pa,Pb)P_{b}\times b-P_{a}\times a=gcd(P_{a},P_{b}) Pb×b−Pa×a=gcd(Pa,Pb)
带入扩展欧几里得算法就可求解
注意,不能直接求PaP_{a}Pa的最小整数解,然后算出PbP_{b}Pb,这样算出来的PbP_{b}Pb可能是负数,此时我们需要不断给调整PaP_{a}Pa来使PbP_{b}Pb为正数
P3811 【模板】乘法逆元
此题参照我的另一篇题解
P2054 P2054 [AHOI2005]洗牌洗牌
可以看出,一张牌在被洗过一次后,它的位置就从ppp变成了2p mod (n+1)2p\;mod\;(n+1)2pmod(n+1)
假设一张牌p在移动m此后到达了位置x
2mp ≡x(mod n+1)2^{m}p\;\equiv x(mod\;n+1)2mp≡x(modn+1)
m,n,xm,n,xm,n,x均为已知量,代入同余方程就可得出m值
P2158 [SDOI2008] 仪仗队
一眼看出,这题要求的实际上是在1<=x,y<=n1<=x,y<=n1<=x,y<=n中,有多少组gcd(x,y)=1,即ϕ(x)\phi(x)ϕ(x)的和。用一个线性求欧拉函数即可
注意,最后的结果应×2+1\times 2+1×2+1,因为gcd(x,y)和gcd(y,x)不同,并且(2,2)被忽略了
剩下来两道题明天再更新
P2303 [SDOI2012] Longge 的问题
∑i=1ngcd(i,n)=∑dd∣nd∑i=1n[gcd(i,n)=d]=∑dd∣nd∑i=1nd[gcd(i,n)=1]=∑dd∣ndϕ(nd)
\begin{aligned}
&\sum_{i=1}^{n}gcd(i,n)
\\
=&\sum_{d}^{d|n}d\sum_{i=1}^{n}[gcd(i,n)=d]
\\
=&\sum_{d}^{d|n}d\sum_{i=1}^{\frac{n}{d}}[gcd(i,n)=1]
\\
=&\sum_{d}^{d|n}d\phi(\frac{n}{d})
\end{aligned}
===i=1∑ngcd(i,n)d∑d∣ndi=1∑n[gcd(i,n)=d]d∑d∣ndi=1∑dn[gcd(i,n)=1]d∑d∣ndϕ(dn)
我们枚举d,把ϕ(nd)\phi(\frac{n}{d})ϕ(dn)累加就行
因为n很大,ϕ(nd)\phi(\frac{n}{d})ϕ(dn)不能用数组线性求,只能单次用欧拉函数求出
P2155 [SDOI2008] 沙拉公主的困惑
题意可简述为,求
∑i=1n![gcd[i,m!]==1]
\begin{aligned}
&\sum_{i=1}^{n!}[gcd[i,m!]==1]
\end{aligned}
i=1∑n![gcd[i,m!]==1]
我们知道这样一个定理:
gcd(a+kb,b)=gcd(a,b)
\begin{aligned}
gcd(a+kb,b)=gcd(a,b)
\end{aligned}
gcd(a+kb,b)=gcd(a,b)
当bbb等于m!m!m!时,
gcd(a+km!,b)=gcd(a,m!)
\begin{aligned}
gcd(a+km!,b)=gcd(a,m!)
\end{aligned}
gcd(a+km!,b)=gcd(a,m!)
因此我们有了这样一个性质:
任意[km!+1,(k+1)m!][km!+1,(k+1)m!][km!+1,(k+1)m!]区间内与m!m!m!互质的数的数量相同
因为 n>mn>mn>m,所以m!m!m!一定是n!n!n!的因子,n!n!n!一定能被分为n!m!\frac{n!}{m!}m!n!个长度为m!的区间
因此,可以得出
∑i=1n![gcd[i,m!]==1]=∑k=1n!m!∑i=km!+1(k+1)m![gcd(i,m!)==1]=∑k=1n!m!∑i=1m![gcd(i,m!)==1]=n!m!ϕ(m!)=n!(m!)−1ϕ(m!)
\begin{aligned}
& \sum_{i=1}^{n!}[gcd[i,m!]==1]
\\
&=\sum_{k=1}^{\frac{n!}{m!}}{}\sum_{i=km!+1}^{(k+1)m!}[gcd(i,m!)==1]
\\
&=\sum_{k=1}^{\frac{n!}{m!}}{}\sum_{i=1}^{m!}[gcd(i,m!)==1]
\\
&=\frac{n!}{m!}\phi(m!)
\\
&=n!(m!)^{-1}\phi(m!)
\end{aligned}
i=1∑n![gcd[i,m!]==1]=k=1∑m!n!i=km!+1∑(k+1)m![gcd(i,m!)==1]=k=1∑m!n!i=1∑m![gcd(i,m!)==1]=m!n!ϕ(m!)=n!(m!)−1ϕ(m!)
因此,我们只需求(m!)−1(mod R)(m!)^{-1}(mod\;R)(m!)−1(modR),记得特判R∣n!R|n!R∣n!就A掉了
本文通过多个编程竞赛题目,深入浅出地讲解了同余方程、扩展欧几里得算法、欧拉函数在线性求解中的应用。涉及到的关键概念包括线性同余方程的求解、乘法逆元、欧拉函数的计算,以及如何在实际问题中灵活运用这些数学工具解决问题。
3865

被折叠的 条评论
为什么被折叠?



