警示后人 70pts
查看原帖
警示后人 70pts
358971
朦胧_XY楼主2022/10/30 12:46

如果你用的是二分法,那一定要判上 l==r 的情况(即p==q),我是出来的时候判了一下,结果没发现pq没更新挂大分。

#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
ll K, n, e, d, p, q, m;
int main(){
	//freopen("decode.in", "r", stdin);
	//freopen("decode.out", "w", stdout);
	ll l, r, flag;
	scanf("%lld", &K);
	while(K--){
		scanf("%lld%lld%lld", &n, &d, &e);
		m = n - e * d + 2, flag = 0;
		l = 1, r = m >> 1, q = m - 1;
		if(r * (m - r) < n || m - 1 > n){ printf("NO\n"); continue;}
		while(l <= r){
			p = (l + r) >> 1, q = m - p;
			if(p * q == n){ flag = 1; break;}
			if(p * q < n) l = p + 1;
			else r = p - 1;
		}
		if(p * q == n) flag = 1;
		if(!flag) printf("NO\n");
		else printf("%lld %lld\n", p, q);
	}
	return 0;
}
2022/10/30 12:46
加载中...