P8814 [CSP-J 2022] 解密
法一:暴力枚举
由于知道
p
∗
q
=
n
p*q=n
p∗q=n所以我们可以枚举
p
=
1
−
>
n
,
q
=
n
p
p=1~~~~->~ \sqrt{n},q=\frac{n}{p}
p=1 −> n,q=pn
时间复杂度
O
(
n
k
)
O(\sqrt{n}k)
O(nk)
估计得分:50~60
法二: 数学
首先我们观察题面,(假设现在是有解情况)
n
=
p
i
∗
q
i
,
e
i
∗
d
i
=
(
p
i
−
1
)
(
q
i
−
1
)
+
1
n=p_i*q_i,e_i*d_i=(p_i-1)(q_i-1)+1
n=pi∗qi,ei∗di=(pi−1)(qi−1)+1
我们把2式化简一下(以下下标自动省略)
e
d
=
(
p
−
1
)
(
q
−
1
)
+
1
=
p
(
q
−
1
)
−
(
q
−
1
)
+
1
=
p
q
−
p
−
q
+
1
+
1
=
n
−
(
p
+
q
)
+
2
p
+
q
=
n
−
e
d
+
2
\begin{aligned} ed&=(p-1)(q-1)+1 \\ &=p(q-1)-(q-1)+1 \\ &=pq-p-q+1+1 \\ &=n-(p+q)+2 \\ p+q&=n-ed+2 \end{aligned}
edp+q=(p−1)(q−1)+1=p(q−1)−(q−1)+1=pq−p−q+1+1=n−(p+q)+2=n−ed+2
综上
p
q
=
n
p
+
q
=
n
−
e
d
+
2
pq=n \\ p+q=n-ed+2
pq=np+q=n−ed+2
观察一下,发现,由于我们已经知道了p+q,所以只要知道p-q即可求出
大家还记得完全平方公式吗?
完全平方和:
(
p
+
q
)
2
=
p
2
+
q
2
+
2
p
q
(p+q)^2=p^2+q^2+2pq
(p+q)2=p2+q2+2pq
完全平方差:
(
p
−
q
)
2
=
p
2
+
q
2
−
2
p
q
(p-q)^2=p^2+q^2-2pq
(p−q)2=p2+q2−2pq
我们用完全平方和-完全平方差:
(
p
+
q
)
2
−
(
p
−
q
)
2
=
p
2
+
q
2
+
2
p
q
−
p
2
−
q
2
+
2
p
q
=
4
p
q
(
p
−
q
)
2
=
4
p
q
+
(
p
+
q
)
2
p
−
q
=
(
p
+
q
)
2
+
4
p
q
\begin{aligned} (p+q)^2-(p-q)^2&=p^2+q^2+2pq-p^2-q^2+2pq \\ &=4pq \\ (p-q)^2&=4pq+(p+q)^2 \\ p-q&=\sqrt{(p+q)^2+4pq} \end{aligned}
(p+q)2−(p−q)2(p−q)2p−q=p2+q2+2pq−p2−q2+2pq=4pq=4pq+(p+q)2=(p+q)2+4pq
综上
p
+
q
=
n
−
e
d
+
2
p
−
q
=
(
p
+
q
)
2
+
4
p
q
一式
+
二式得
2
p
=
n
−
e
d
+
2
+
(
p
+
q
)
2
+
4
p
q
2
p
=
n
−
e
d
+
2
+
(
n
−
e
d
+
2
)
2
+
4
n
p
=
n
−
e
d
+
2
+
(
n
−
e
d
+
2
)
2
+
4
n
2
q
=
n
−
e
d
+
2
−
n
−
e
d
+
2
+
(
n
−
e
d
+
2
)
2
+
4
n
2
\begin{aligned} &p+q=n-ed+2\\ &p-q=\sqrt{(p+q)^2+4pq}\\ &一式+二式得 \\ 2p&=n-ed+2+\sqrt{(p+q)^2+4pq}\\ 2p&=n-ed+2+\sqrt{(n-ed+2)^2+4n}\\ p&=\frac{n-ed+2+\sqrt{(n-ed+2)^2+4n}}{2}\\ q&=n-ed+2-\frac{n-ed+2+\sqrt{(n-ed+2)^2+4n}}{2} \end{aligned}
2p2ppqp+q=n−ed+2p−q=(p+q)2+4pq一式+二式得=n−ed+2+(p+q)2+4pq=n−ed+2+(n−ed+2)2+4n=2n−ed+2+(n−ed+2)2+4n=n−ed+2−2n−ed+2+(n−ed+2)2+4n
法三:二分
法三与法一类似,只是
p
p
p的枚举是用二分实现的
枚举
p
p
p通过
e
d
=
(
p
−
1
)
(
q
−
1
)
+
1
ed=(p-1)(q-1)+1
ed=(p−1)(q−1)+1可以推导出
q
=
e
d
−
1
p
−
1
+
1
q=\frac{ed-1}{p-1}+1
q=p−1ed−1+1
如果
p
q
<
n
pq<n
pq<n,右移;反之左移