2022CSP-J T2解密题解

题目传送门

题目分析

首先对于

式 1 : n = p q , 式1:n=pq, 1n=pq
式 2 : e d = ( p − 1 ) ( q − 1 ) + 1 式2:ed=(p-1)(q-1)+1 2ed=(p1)(q1)+1

可以进行化简。

式 3 : e d = p q − p − q + 2 式3:ed=pq-p-q+2 3ed=pqpq+2

式 1 式1 1带入 式 3 式3 3得,

式 4 : e d = n − p − q + 2 式4:ed=n-p-q+2 4ed=npq+2

整理易得:

式 5 : n − e d + 2 = p + q 式5:n-ed+2=p+q 5ned+2=p+q

式 5 式5 5

p = n − e d − q + 2 p=n-ed-q+2 p=nedq+2

思路

枚举法

50分

考虑在区间 [ 1 , n − e d ] [1,n-ed] [1,ned]中枚举一正整数 q q q,从而算出 p p p值,使得 ( p − 1 ) ( q − 1 ) + 1 = e d (p-1)(q-1)+1=ed (p1)(q1)+1=ed

时间复杂度: O ( k n ) O(kn) O(kn)

100分

考虑到区间 [ 1 , n − e d ] [1,n-ed] [1,ned]满足单调性,可采取二分优化求解。

时间复杂度: O ( k log ⁡ 2 n ) O(k \log_{2}{n}) O(klog2n)

数学法

因为 p = n − e d − q p=n-ed-q p=nedq,结合 式 1 式1 1 q ( n − e d − q + 2 ) = n q(n-ed-q+2)=n q(nedq+2)=n
由乘法分配律得 − p 2 + p ( n − e d + 2 ) = n -p^2+p(n-ed+2)=n p2+p(ned+2)=n
显然此为一元二次方程,
根据公式可知根为: − ( n − e d + 2 ) ± ( n − e d + 2 ) 2 − 4 n − 2 \frac{-(n-ed+2)\pm \sqrt{(n-ed+2)^2-4n}}{-2} 2(ned+2)±(ned+2)24n
其中 ( n − e d + 2 ) 2 − 4 n (n-ed+2)^2-4n (ned+2)24n若为负数,则方程无实数解,输出NO
否则由于 p < q pp<q,
所以:
p = − ( n − e d + 2 ) − ( n − e d + 2 ) 2 − 4 n − 2 p=\frac{-(n-ed+2)- \sqrt{(n-ed+2)^2-4n}}{-2} p=2(ned+2)(ned+2)24n
q = − ( n − e d + 2 ) + ( n − e d + 2 ) 2 − 4 n − 2 q=\frac{-(n-ed+2)+ \sqrt{(n-ed+2)^2-4n}}{-2} q=2(ned+2)+(ned+2)24n

需要注意的是,由于浮点数运算存在误差,所以算出的 p , q p,q pq得判断是否满足条件。

时间复杂度: O ( k ) O(k) O(k)

代码

枚举法

50分代码:点击此处
100分代码:点击此处

数学法

100分代码:点击此处

你可能感兴趣的:(算法,c++)