由于这是考试第一题 所以一定很水
思路
首先 我们先看是输出"NO" 还是 “YES”
显然当a=1a=1a=1会输出NO
因为一旦他满足他是aaa的倍数的情况 他就一定满足他是A∗BA*BA∗B的倍数
所以这样的话 我们就找不出所谓的接近好数 只存在好数
因此 当b=1输出NO
那么当b>=2b>=2b>=2输出YES之后 该怎么输出xxx yyy zzz呢?
我们知道 最小的好数就是a∗ba*ba∗b它本身
接下来的问题就是 如何满足x+y=zx+y=zx+y=z
我们又想 a∗(b+1)a*(b+1)a∗(b+1)一定是AAA的倍数 而不是a∗ba*ba∗b的倍数 所以我们又找到了一个接近好数
很显然 相信大家都猜到了 第三个数是什么?
当然就是a∗(b+1)−a∗ba*(b+1)-a*ba∗(b+1)−a∗b也就是 aaa 它本身
并且 AAA 是 AAA 的倍数 且 不是a∗ba*ba∗b的倍数 还满足a+a∗b=a∗(b+1)a+a*b=a*(b+1)a+a∗b=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;//根据思路里面的构造方法输出
}
}
}