在思想的天空里自由翱翔。

[CSP-J 2022] 解密

Posted on 2023-06-06 18:15  rayhjfjwl  阅读(271)  评论(0)    收藏  举报  来源

思路:

 

AC code:

#include <iostream>
using namespace std;
#define int long long

signed main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n,d,e;
		cin >> n >> d >>e ;
		int t = n - e * d + 2;
		int l = 1,r = t / 2 + 1;//只用到它的一半即可
		bool flag = false;
		while(l <= r)
		{
			int mid =(l+ r) >> 1;
			int tt = t - mid;
			if(mid *tt == n)
			{
				cout << mid << " " << t - mid << endl;//如果可以的话能够中途输出的
				flag = true;
				break;
			}
			if((mid) * (tt) < n)
			{
				l = mid + 1;
			}
			else
			{
				r = mid - 1;
			}
		}
		if(flag)
		{
			continue;
		}
		if((l) * (t - l) == n)cout << l << " " << t - l << endl;
		else cout << "NO" << endl;//判读无解
	}
	return 0;
 }

  

另外一种解:

 

AC code:

#include <iostream>
#include <cmath> 
using namespace std;
#define int long long

signed main()
{
	int t;
	cin >> t;
	while(t--)
	{
		int n,d,e;
		cin >> n >> d >> e;
		int p = n - e * d + 2 + sqrt((n - e * d + 2) * (n - e * d + 2) - 4 * n);
		int q = n - e * d + 2 - sqrt((n - e * d + 2) * (n - e * d + 2) - 4 * n);
		if(p & 1 ||q & 1 || p < 0 || q < 0)//判断是不是正整数
		{
			cout << "NO" << endl;
		}
		else
		{
			cout << min(p / 2,q / 2)  << " " << max(p / 2,q / 2) << endl;
		}
	}
	return 0;
}