求助 [CSP-J 2022] 解密
  • 板块灌水区
  • 楼主CloudWings
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/11/13 14:08
  • 上次更新2023/10/27 03:07:03
查看原帖
求助 [CSP-J 2022] 解密
569316
CloudWings楼主2022/11/13 14:08

一直 WA60,就是过不了 QAQ

评测记录

我的代码:

/*
已知:n,e,d  求:p,q
n=pq
ed=(p-1)(q-1)+1

ed=pq-(p+q)+2
p+q=n-ed+2
=> q=n-ed+2-p

n=p(n-ed+2-p)
=> -p^2+(n-ed+2)p-n=0
*/
#include <cstdio>
#include <cmath>
#define min(a, b) (a < b ? a : b)
#define ll long long
const double INF = 2e9 + 0.114514;
ll n;
bool check (ll a, ll b, ll c, double x) { return a*x*x + b*x + c == 0; }
void F (ll a, ll b, ll c) {
	double d = b * b - 4.0 * a * c;
	if (d < 0) {
		puts("NO");
		return ;
	}
	d = sqrt(d);
	if (d != (ll)d) {
		puts("NO");
		return ;
	}
	double p1 = (-b + d) / (2.0 * a);
	double p2 = (-b - d) / (2.0 * a);
	if (p1 != (ll)p1/* || !check(a, b, c, p1)*/) p1 = INF;
	if (p2 != (ll)p2/* || !check(a, b, c, p2)*/) p2 = INF;
	double p = min(p1, p2);
	if (p == (ll)p) {
		printf("%.0lf %.0lf\n", p, n / p);
		return ;
	}
	puts("NO");
	return ;
}
ll E, D;
int main () {
//	freopen("decode.in", "r", stdin);
//	freopen("decode.out", "w", stdout);
	int T;
	scanf("%d", &T);
	while (T--) {
		scanf("%lld%lld%lld", &n, &E, &D);
		F(-1, n - E * D + 2, -n);
	}
	return 0;
}
2022/11/13 14:08
加载中...