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