又来到令人痛苦的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)
ma−na≡y−x(modL)
(
m
−
n
)
a
≡
y
−
x
(
m
o
d
L
)
(m-n)a\equiv y-x(mod\;L)
(m−n)a≡y−x(modL)
m
,
n
,
x
,
y
m,n,x,y
m,n,x,y都是已知常量,接下来我们就可以愉快套板子了
值得注意的是, m − n m-n m−n可能是一个负数,这时便需交换两只青蛙的值
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×b−Pa×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×b−Pa×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)
2mp≡x(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=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,把
ϕ
(
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=1∑n![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=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 ( m o d R ) (m!)^{-1}(mod\;R) (m!)−1(modR),记得特判 R ∣ n ! R|n! R∣n!就A掉了