前言

蒟蒻感叹!许多大佬的思路真的很复杂,于是为了部分没学过的人写了这篇题解(其实就是为了咕值),值得一看!

正文

算法:式子推导

从题中可得 \(\begin{cases}n_i = p_i \times q_i \\ e_i \times d_i = (p_i – 1)(q_i – 1) + 1\end{cases}\),先拆开式子得到 \(\begin{cases} n_i = p_i \times q_i \\e_i\times d_i=p_i\times q_i-p_i-q_i+2 \end{cases}\)\(\Rightarrow \begin{cases}p_i \times q_i =n_i\\p_i+q_i=p_i\times q_i-e_i\times d_i+2\end{cases}\)\(\Rightarrow \begin{cases}p_i \times q_i =n_i\\p_i+q_i=n_i-e_i\times d_i+2\end{cases}\),设 \(p_i+q_i=s_i\) 根据公式 \((a+b)^2-4\times a\times b=(a-b)^2\),可以求出 \(p_i-q_i=\sqrt{{s_i}^2-4\times n_i}\)

可得 \(\begin{cases}p_i+q_i\\p_i-q_i\end{cases}\),易求解。

那么,如何判定原式无解?需注意题中说明 \(p_i,q_i\) 是整数,可推知 \(p_i-q_i\) 也是整数,我们知道 C++ 整数型向下取整,若开根号的值是非整数,那么 \(p_i-q_i\) 会变小,即 \(p_i\times q_i< n_i\)因此将最后求解得到的 \(p_i,q_i\) 相乘与 \(n_i\) 比较即可,若不相等,则无解。

代码:

#include<iostream>
#include<math.h>
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;
long long n,e,d,p,q,T;
int main(){
	ios::sync_with_stdio(false),cin.tie(0);
	cin>>T;
	while(T--){
		cin>>n>>d>>e;
		long long s1=n-e*d+2;//p+q
		long long s2=sqrt(s1*s1-4*n);//p-q
		p=(s1+s2)/2,q=s1-p;
		if(p*q==n)	cout<<min(p,q)<<" "<<max(p,q)<<"\n";//题中说先大后小
		else	cout<<"NO\n";
	}
	return 0;
}

完结!

后附

日志

v1.0 on 2022.11.04: 发布

原文地址:http://www.cnblogs.com/wanguan/p/16861060.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性