2021CCPC广州 超级好懂的部分题解(H)

H - Three Integers(思维题)

        这题首先想到的一个特例是 a=b=c=0,显然x、y、z就是随便3个相同的数就可以。

        然后来看a、b、c不全为零的一般情况,我们可以将题目要求写成:

                                     \\x=n_{1}*y+a(y>a)\\ y=n_{2}*z+b(z>b)\\ z=n_{3}*x+c(x>c)

        可以发现n1、n2、n3这三个数必须至少有一个为0,不然x、y、z就满足x>y,y>z,z>x,那么不会存在这样的x、y、z。接下来就可以分类讨论了,分三种情况:

                                      \\1. n_{1}=0 (a>b)\\ 2. n_{2}=0 (b>a)\\ 3. n_{3}=0 (c>b)\\

        括号内即为此种类别需满足的条件。例如:若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时:

        \\x:x=a\\ z:(z=n_{3}*x+c>b)\rightarrow (n_{3}>\frac{b-c}{a})\rightarrow (n_{3}=\frac{b-c}{a}+1)\\\rightarrow (z=(\frac{b-c}{a}+1)*a+c)\\ y:(y=n_{2}*z+b>a)\rightarrow (n_{2}>\frac{a-b}{z})\rightarrow (n_{2}=\frac{a-b}{z}+1)\\\rightarrow (y=(\frac{a-b}{z}+1)*z+b)

        注意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();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值