CF1521A题解

由于这是考试第一题 所以一定很水

思路

首先 我们先看是输出"NO" 还是 “YES”

显然当a=1a=1a=1会输出NO

因为一旦他满足他是aaa的倍数的情况 他就一定满足他是A∗BA*BAB的倍数

所以这样的话 我们就找不出所谓的接近好数 只存在好数

因此 当b=1输出NO

那么当b>=2b>=2b>=2输出YES之后 该怎么输出xxx yyy zzz呢?

我们知道 最小的好数就是a∗ba*bab它本身

接下来的问题就是 如何满足x+y=zx+y=zx+y=z

我们又想 a∗(b+1)a*(b+1)a(b+1)一定是AAA的倍数 而不是a∗ba*bab的倍数 所以我们又找到了一个接近好数

很显然 相信大家都猜到了 第三个数是什么?

当然就是a∗(b+1)−a∗ba*(b+1)-a*ba(b+1)ab也就是 aaa 它本身

并且 AAAAAA 的倍数 且 不是a∗ba*bab的倍数 还满足a+a∗b=a∗(b+1)a+a*b=a*(b+1)a+ab=a(b+1)

也就是说 我们找到了x,y,zx,y,zx,y,z其中两个是接近好数 另外一个是完全好数 并且满足x+y=zx+y=zx+y=z

所以此题也就大功告成了

代码

#include<bits/stdc++.h>
using namespace std;
long long n,m,t;//记得开long long
int main()
{
	cin>>t;
	while(t--)//T组测试数据
	{
		cin>>n>>m;//输入
		if(m==1)//如果m==1 输出"NO"
		{
			cout<<"NO"<<endl;
		}
		else//如果m>=2 输出“YES" 并输出x,y,z
		{
			cout<<"YES"<<endl;
			cout<<n*m<<" "<<n<<" "<<n*(m+1)<<endl;//根据思路里面的构造方法输出
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值