2022csp普及组真题:解密(decode)

2022csp普及组真题:解密(decode)

题目

【题目描述】

给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni , ei , di,求两个正整数 pi , qi, 使 ni = pi × qi ,  ei × di = (pi − 1)(qi − 1) + 1。

【输入格式】

从文件 decode.in 中读入数据。

第一行一个正整数 k,表示有 k 次询问。

接下来 k 行,第 i 行三个正整数 ni , di , ei。

【输出格式】

输出到文件 decode.out 中。

输出 k 行,每行两个正整数 pi , qi 表示答案。

为使输出统一,你应当保证 pi ≤ qi。

如果无解,请输出 NO。

【样例 1 输入】

10

770  77  5

633  1  211

545  1  499

683  3  227

858  3  257

723  37  13

572  26  11

867  17  17

829  3  263

528  4  109

【样例 1 输出】

2  385

NO

NO

NO

11  78

3  241

2  286

NO

NO

6  88

解法

#include<bits/stdc++.h>
using namespace std;
int k;
int main()
{
	//freopen("decode.in","r",stdin);
	//freopen("decode.out","w",stdout);
	scanf("%d",&k);
	for(int i=1;i<=k;i++)
	{
		long long n,d,e;
		scanf("%lld %lld %lld",&n,&d,&e);
		long long s=n-d*e+2;
		long long r=(n-d*e+2)/2,l=1;
		while(l<r)
		{
			int mid=(l+r)/2;
			if(mid*(s-mid)>=n)
			{
				r=mid;
			}
			else
			{
				l=mid+1;
			}
		}
		if(l*(s-l)==n)
		{
			printf("%lld %lld\n",l,(s-l));
		}
		else
		{
			printf("NO\n");
		}
		
	}
	
	return 0;
}
posted @ 2022-11-19 16:10  全角的!与半角的!  阅读(1312)  评论(0编辑  收藏  举报