H - Three Integers(思维题)
这题首先想到的一个特例是 a=b=c=0,显然x、y、z就是随便3个相同的数就可以。
然后来看a、b、c不全为零的一般情况,我们可以将题目要求写成:
可以发现n1、n2、n3这三个数必须至少有一个为0,不然x、y、z就满足x>y,y>z,z>x,那么不会存在这样的x、y、z。接下来就可以分类讨论了,分三种情况:
括号内即为此种类别需满足的条件。例如:若n1=0,则x=a,又因为x需大于c,所以要满足a>b才能让n1=0。这里还有一个特例,就是a=b=c但是不为0,这个特例可以发现n1=0和n2=0和n3=0的条件都不满足,所以违背n1、n2、n3这三个数必须至少有一个为0,所以这种特例无解,同上面a=b=c=0一起特判掉就好。剩下的情况都是有解的,然后以第一种类别举例,如何得到x、y、z。n1=0时:
注意z和y不能直接按这个式子求解,例如求z时需判断b-c是否大于零,大于零则按此式,若小于零,要把n3取1,要不然可能就成负数了。
然后n2=0和n3=0的方法和上面的一致,就不赘述了,记得开ll
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const double PI = acos(-1.0);
int T;
ll a,b,c,x,y,z;
void solve(){
scanf("%lld%lld%lld",&a,&b,&c);
if(a==0&&b==0&&c==0){
printf("YES\n1 1 1\n");
return;
}
else if(a==b&&b==c){
printf("NO\n");
return;
}
if(a>c){
x=a;
z=((b-c)>=0?(b-c)/a+1:1)*a+c;
y=((a-b)>=0?(a-b)/z+1:1)*z+b;
}
else if(b>a){
y=b;
x=((c-a)>=0?(c-a)/b+1:1)*b+a;
z=((b-c)>=0?(b-c)/x+1:1)*x+c;
}
else{
z=c;
y=((a-b)>=0?(a-b)/c+1:1)*c+b;
x=((c-a)>=0?(c-a)/y+1:1)*y+a;
}
printf("YES\n%lld %lld %lld\n",x,y,z);
}
int main(){
scanf("%d",&T);
while(T--) solve();
}