0
点赞
收藏
分享

微信扫一扫

gcd,扩欧,同余,欧拉函数总结

Aliven888 2022-04-01 阅读 40
线性代数

又来到令人痛苦的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 青蛙的约会

设两只青蛙跳跃 a a a次后相遇

x + m a ≡ = y + n a ( m o d    L ) x+ma\equiv=y+na(mod\;L) x+ma=y+na(modL)
m a − n a ≡ y − x ( m o d    L ) ma-na\equiv y-x(mod\;L) manayx(modL)
( m − n ) a ≡ y − x ( m o d    L ) (m-n)a\equiv y-x(mod\;L) (mn)ayx(modL)
m , n , x , y m,n,x,y m,n,x,y都是已知常量,接下来我们就可以愉快套板子了

值得注意的是, m − n m-n mn可能是一个负数,这时便需交换两只青蛙的值

P1292 倒酒

说实话,我觉得这题至少得评绿,楼上一板子题还是绿呢…

总而言之,这道题的思想还是很巧妙的

P a P_{a} Pa最小这一限制可知在a不满的时候就把a里面的酒倒出来是一种 傻逼透顶 没有价值(无法使答案最小,却会使 P a P_{a} Pa白白增大)的行为

又因为 P b P_{b} Pb也要尽量最小,所以结束是b酒杯中一定是空的。

综上,我们可以写出下面的式子
P b × b − P a × a = a n s P_{b}\times b-P_{a}\times a=ans Pb×bPa×a=ans

若要让 a n s ans ans最小,则 a n s = g c d ( P a , P b ) ans=gcd(P_{a},P_{b}) ans=gcd(Pa,Pb)

我们让 P a , P b P_{a},P_{b} Pa,Pb同除于 g g g,此时 P a , P b P_{a},P_{b} Pa,Pb互质

接下来,我们就可以写出
P b × b − P a × a = g c d ( P a , P b ) P_{b}\times b-P_{a}\times a=gcd(P_{a},P_{b}) Pb×bPa×a=gcd(Pa,Pb)

带入扩展欧几里得算法就可求解

注意,不能直接求 P a P_{a} Pa的最小整数解,然后算出 P b P_{b} Pb,这样算出来的 P b P_{b} Pb可能是负数,此时我们需要不断给调整 P a P_{a} Pa来使 P b P_{b} Pb为正数

P3811 【模板】乘法逆元

此题参照我的另一篇题解

P2054 P2054 [AHOI2005]洗牌洗牌

可以看出,一张牌在被洗过一次后,它的位置就从 p p p变成了 2 p    m o d    ( n + 1 ) 2p\;mod\;(n+1) 2pmod(n+1)

假设一张牌p在移动m此后到达了位置x
2 m p    ≡ x ( m o d    n + 1 ) 2^{m}p\;\equiv x(mod\;n+1) 2mpx(modn+1)

m , n , x m,n,x m,n,x均为已知量,代入同余方程就可得出m值

P2158 [SDOI2008] 仪仗队

一眼看出,这题要求的实际上是在 1 < = x , y < = n 1<=x,y<=n 1<=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 = 1 n g c d ( i , n ) = ∑ d d ∣ n d ∑ i = 1 n [ g c d ( i , n ) = d ] = ∑ d d ∣ n d ∑ i = 1 n d [ g c d ( i , n ) = 1 ] = ∑ d d ∣ n d ϕ ( n d ) \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=1ngcd(i,n)ddndi=1n[gcd(i,n)=d]ddndi=1dn[gcd(i,n)=1]ddndϕ(dn)
我们枚举d,把 ϕ ( n d ) \phi(\frac{n}{d}) ϕ(dn)累加就行

因为n很大, ϕ ( n d ) \phi(\frac{n}{d}) ϕ(dn)不能用数组线性求,只能单次用欧拉函数求出

P2155 [SDOI2008] 沙拉公主的困惑

题意可简述为,求
∑ i = 1 n ! [ g c d [ i , m ! ] = = 1 ] \begin{aligned} &\sum_{i=1}^{n!}[gcd[i,m!]==1] \end{aligned} i=1n![gcd[i,m!]==1]

我们知道这样一个定理:
g c d ( a + k b , b ) = g c d ( a , b ) \begin{aligned} gcd(a+kb,b)=gcd(a,b) \end{aligned} gcd(a+kb,b)=gcd(a,b)
b b b等于 m ! m! m!时,
g c d ( a + k m ! , b ) = g c d ( a , m ! ) \begin{aligned} gcd(a+km!,b)=gcd(a,m!) \end{aligned} gcd(a+km!,b)=gcd(a,m!)

因此我们有了这样一个性质:
任意 [ k m ! + 1 , ( k + 1 ) m ! ] [km!+1,(k+1)m!] [km!+1,(k+1)m!]区间内与 m ! m! m!互质的数的数量相同

因为 n > m n>m n>m,所以 m ! m! m!一定是 n ! n! n!的因子, n ! n! n!一定能被分为 n ! m ! \frac{n!}{m!} m!n!个长度为m!的区间

因此,可以得出
∑ i = 1 n ! [ g c d [ i , m ! ] = = 1 ] = ∑ k = 1 n ! m ! ∑ i = k m ! + 1 ( k + 1 ) m ! [ g c d ( i , m ! ) = = 1 ] = ∑ k = 1 n ! m ! ∑ i = 1 m ! [ g c d ( 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=1n![gcd[i,m!]==1]=k=1m!n!i=km!+1(k+1)m![gcd(i,m!)==1]=k=1m!n!i=1m![gcd(i,m!)==1]=m!n!ϕ(m!)=n!(m!)1ϕ(m!)

因此,我们只需求 ( m ! ) − 1 ( m o d    R ) (m!)^{-1}(mod\;R) (m!)1(modR),记得特判 R ∣ n ! R|n! Rn!就A掉了

举报

相关推荐

0 条评论