Skip to main content
Original156 words1 min

题解:P14069 初遇

Summary

从两个数 a 和 b 出发,每步把其中一个数替换为两数之和,问能否让它们始终不等于 n。当 a、b 或 a 加 b 已等于 n 时无解。若 a 不等于 b,两条演化路径上的两个数恒不相等,至少一条能避开 n,必定有解;若 a 等于 b,仅当第一次操作后的 3a 等于 n 才无解。据此直接判断输出 Yes 或 No。

解题思路​

显然 a=na=n 或 b=nb=n 或 a+b=na+b=n 无解。

如果 a≠ba\ne b,第一步操作后,得到:

A=a,B=a+bA=a,B=a+b

或:

A=a+b,B=bA=a+b,B=b

后续每一步始终操作另一个数,得到:

A=a+k(a+b),B=a+bA=a+k(a+b),B=a+b

或:

A=a+b,B=b+k(a+b)A=a+b,B=b+k(a+b)

由于 a≠ba\ne b,即 a+k(a+b)≠b+k(a+b)a+k(a+b)\ne b+k(a+b),至少有一种情况不等于 nn,因此一定有解。

如果 a=ba=b,第一次操作后除非 A+B=3a=nA+B=3a=n 无解,否则一定有解。

参考代码​

267 Bcpp
#include <bits/stdc++.h>
using namespace std;

using ll=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--)
{
ll a,b,n;
cin>>a>>b>>n;
cout<<(a==n||b==n||a+b==n||(a==b&&a*3==n)?"No":"Yes")<<'\n';
}
return 0;
}