💡 Knowledge is power, Mr.Pa always al|

Panda_LYL

园龄:4个月粉丝:0关注:0

2024-10-23 12:08阅读: 15评论: 0推荐: 0

P8814 [CSP-J 2022] 解密 题解

解方程

n=pqed=(p1)(q1)+1m=ned+2.

ed:

ed=p(q1)(q1)+1

ed=pqpq+2

m:

m=n(pqpq+2)+2.

m=npq+p+q2+2

n=pq

m=pqpq+p+q2+2

m=p+q.

pq,

pq

p - q = ?

(ab)2=a2+2ab+b2

(a+b)2=a22ab+b2

(a+b)2(ab)2=2ab+2ab=4ab

p=a,q=b

(pq)2=(p+q)24pq

pq=(p+q)24pq.

p+q=m=ned+2n=pq

pq=(ned+2)24n

方程组

{p+q=ned+2pq=(ned+2)24n

n,e,dpqp+q.

.

:

p=(ned+2+(ned+2)24n)2

:

q=(ned+2(ned+2)24n)2

判断是否是正解

2pq=n,ed=(p1)(q1)+1.

pq

.

代码

#include<bits/stdc++.h>
using namespace std;
int k;
int main() {
// freopen("decode.in", "r", stdin);
// freopen("decode.out", "w", stdout);
scanf("%d", &k);
while (k--) {
long long n, d, e;
scanf("%lld%lld%lld", &n, &d, &e);
// 接下来就是套公式
long long p = (n - e * d + 2 + sqrt((n - e * d + 2) * (n - e * d + 2) - 4 * n)) / 2;
long long q = (n - e * d + 2 - sqrt((n - e * d + 2) * (n - e * d + 2) - 4 * n)) / 2;
// 判断这2个解是否成立
if (p * q == n && e * d == (p - 1) * (q - 1) + 1&& p && q) {
if (p > q) swap(p, q); // 小的数在前面
printf("%lld %lld\n", p, q);
}
else
printf("NO\n");
}
return 0;
}

知识点

本文作者:panda-lyl

本文链接:https://www.cnblogs.com/panda-lyl/p/18496098

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Panda_LYL  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起