原题题面:https://ac.nowcoder.com/acm/contest/33191/J
题目大意:给定A,B,C,x,有两种操作:
1.将B变成A-B
2.将C变成B-C
问是否可以让C=x
分析:
因为对同一个操作连续执行两次,值会与两次操作前的值相等,所以要交替操作
分类讨论:
若1,2操作次数相等 则有
C
1
=
C
+
k
∗
(
A
−
2
∗
B
)
C_1=C+k*(A-2*B)
C1=C+k∗(A−2∗B)
若次数不等,则有
C
1
=
B
−
C
+
k
∗
(
A
−
2
∗
B
)
C_1=B-C+k*(A-2*B)
C1=B−C+k∗(A−2∗B)
所以当
A
−
2
∗
B
A-2*B
A−2∗B不为零时 只需判断
(
x
−
C
)
或
(
x
−
B
+
C
)
(x-C)或(x-B+C)
(x−C)或(x−B+C)能否被
(
A
−
2
∗
B
)
(A-2*B)
(A−2∗B)整除即可
若
A
−
2
∗
B
A-2*B
A−2∗B ,则只要判断一开始
C
C
C是否等于
x
x
x,
B
−
C
B-C
B−C等于
x
x
x,或
A
−
B
−
C
A-B-C
A−B−C等于
x
x
x即可
代码:
#include<bits/stdc++.h>
using namespace std;
long long LABS(long long xx){
if(xx>0) return xx;
return -xx;
}
int main(){
int t,flag;
long long a,b,c,x,d,e,f;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld%lld",&a,&b,&c,&x);
if(a==2*b){
if(c==x || b-c==x || a-b-c==x){
printf("Yes\n");
} else {
printf("No\n");
}
} else {
d=x-c;
e=a-2*b;
f=x-b+c;
if(d%e==0|| f%e==0){
printf("Yes\n");
} else{
printf("No\n");
}
}
}
}