2021CCPC华为云挑战赛-1006 仓颉造数
赛时没做出来,当我推出大概结论的时候已经16:02了,这里还是打算把题解写一下,因为感觉官方题解概括性很强所以部分同学
(指我这个菜鸡)可能看不懂,所以这里写一些自己的思路
前方大量数学公式预警
题目大意
因为是中文题目,所以就不写了(咕)
解题思路
先说最终结论:对 a b \frac{a}{b} ba约分后,若满足 a + b = 2 m a+b=2^m a+b=2m,则能够合成 1 1 1。
(官方题解有写,这里给出貌似也没啥用)
实际上那个999999999999比较大所以不用管天数……
下述证明过程中只使用了 x + y 2 \frac{x+y}{2} 2x+y,没有使用 2 x y x + y \frac{2xy}{x+y} x+y2xy,理由是:2 x y x + y 等 价 于 2 1 x + 1 y 所 以 当 我 们 要 求 出 1 时 , 只 需 要 x + y = 2 ( 由 式 1 推 得 ) 或 1 x + 1 y = 2 ( 由 式 2 推 得 ) 而 如 果 我 们 可 以 得 出 x , 则 一 定 也 可 以 得 到 它 的 倒 数 1 x 原 因 是 : 我 们 得 初 值 a b 和 b a 互 为 倒 数 , 并 且 将 其 带 入 到 式 1 和 式 2 中 会 得 到 2 a b a 2 + b 2 和 a 2 + b 2 2 a b 也 互 为 倒 数 我 们 可 以 选 择 其 中 任 意 一 个 表 达 式 选 取 我 们 所 需 要 的 结 果 \frac{2xy}{x+y}等价于\frac{2}{\frac{1}{x}+\frac{1}{y}} \\ \ \\ 所以当我们要求出1时,只需要x+y=2(由式1推得)或\frac{1}{x}+\frac{1}{y}=2(由式2推得)\\ \ \\ 而如果我们可以得出x,则一定也可以得到它的倒数\frac{1}{x}\\ \ \\ 原因是:我们得初值\frac{a}{b}和\frac{b}{a}互为倒数,\\ \ \\ 并且将其带入到式1和式2中会得到\frac{2ab}{a^2+b^2}和\frac{a^2+b^2}{2ab}也互为倒数\\ \ \\ 我们可以选择其中任意一个表达式选取我们所需要的结果 x+y2xy等价于x1+y12 所以当我们要求出1时,只需要x+y=2(由式1推得)或x1+y1=2(由式2推得) 而如果我们可以得出x,则一定也可以得到它的倒数x1 原因是:我们得初值ba和ab互为倒数, 并且将其带入到式1和式2中会得到a2+b22ab和2aba2+b2也互为倒数 我们可以选择其中任意一个表达式选取我们所需要的结果
首先证明下面一个结论:在任意一天,我们获得的数一定满足如下表达式(该表达式可以通过手算得到规律)
x a 2 + y b 2 ( x + y ) a b , 其 中 x + y = 2 m \frac{xa^2+yb^2}{(x+y)ab},其中x+y=2^m \\ (x+y)abxa2+yb2,其中x+y=2m
证明前同时给出该公式的另一表达形式,方便看懂后面的部分:
x a 2 + y b 2 ( x + y ) a b , 其 中 x + y = 2 m ⇒ x a 2 + ( t − x ) b 2 t a b , 其 中 x + y = 2 m = t \frac{xa^2+yb^2}{(x+y)ab},其中x+y=2^m \\ \Rightarrow \frac{xa^2+(t-x)b^2}{tab},其中x+y=2^m=t\\ \\ (x+y)abxa2+yb2,其中x+y=2m⇒tabxa2+(t−x)b2,其中x+y=2m=t证明:利用数学归纳法的思想
在第0天的时候, a b \frac{a}{b} ba和 b a \frac{b}{a} ab分别是上述表达式在 x = 1 , y = 0 x=1,y=0 x=1,y=0和 x = 0 , y = 1 x=0,y=1 x=0,y=1时的特例。
在以后的某一天当中,我选取的任意两个数一定满足上述表达式,则
x 1 a 2 + ( t 1 − x 1 ) b 2 t 1 a b + x 2 a 2 + ( t 2 − x 2 ) b 2 t 2 a b 2 ( 计 算 两 项 之 和 ) = x 1 t 2 a 2 + ( t 1 t 2 − x 1 t 2 ) b 2 + x 2 t 1 a 2 + ( t 1 t 2 − x 2 t 1 ) b 2 2 t 1 t 2 a b ( 通 分 ) = ( x 1 t 2 + x 2 t 1 ) a 2 + ( 2 t 1 t 2 − ( x 1 t 2 + x 2 t 1 ) ) b 2 2 t 1 t 2 a b ( 合 并 同 类 型 ) 令 X = x 1 t 2 + x 2 t 1 , T = 2 t 1 t 2 , 则 上 述 表 达 式 可 以 进 一 步 化 简 为 : X a 2 + ( T − X ) b 2 T a b ( 看 上 去 就 舒 服 多 了 ) 而 此 时 我 们 可 以 发 现 T = 2 t 1 t 2 = 2 ⋅ 2 m 1 ⋅ 2 m 2 = 2 m 1 + m 2 + 1 = X + Y 即 新 得 到 的 表 达 式 也 满 足 条 件 \frac{\frac{x_1a^2+(t_1-x_1)b^2}{t_1ab} + \frac{x_2a^2+(t_2-x_2)b^2}{t_2ab}}{2}(计算两项之和)\\ \ \\ =\frac{x_1t_2a^2+(t_1t_2-x_1t_2)b^2+x_2t_1a^2+(t_1t_2-x_2t_1)b^2}{2t_1t_2ab}(通分)\\ \ \\ =\frac{(x_1t_2 + x_2t_1)a^2+(2t_1t_2-(x_1t_2+x_2t_1))b^2}{2t_1t_2ab} (合并同类型)\\ \ \\ 令X=x_1t_2 + x_2t_1,T=2t_1t_2,则上述表达式可以进一步化简为: \\ \ \\ \frac{Xa^2+(T-X)b^2}{Tab}(看上去就舒服多了) \\ \ \\ 而此时我们可以发现T=2t_1t_2=2·2^{m_1}·2^{m_2} = 2^{m_1+m_2+1}=X+Y\\ \ \\ 即新得到的表达式也满足条件 2t1abx1a2+(t1−x1)b2+t2abx2a2+(t2−x2)b2(计算两项之和) =2t1t2abx1t2a2+(t1t2−x1t2)b2+x2t1a2+(t1t2−x2t1)b2(通分) =2t1t2ab(x1t2+x2t1)a2+(2t1t2−(x1t2+x2t1))b2(合并同类型) 令X=x1t2+x2t1,T=2t1t2,则上述表达式可以进一步化简为: TabXa2+(T−X)b2(看上去就舒服多了) 而此时我们可以发现T=2t1t2=2⋅2m1⋅2m2=2m1+m2+1=X+Y 即新得到的表达式也满足条件
综上,可以得出结论,得到的所有数字均满足上述表达式,证毕。有了上述结论,我们就可以进行下一步的证明。
首先,初始获得的是数字 a b \frac{a}{b} ba和 b a \frac{b}{a} ab,我们先对其进行约分,后面的证明需要用到
a /= __gcd(a,b); b /= __gcd(a,b);
由于我的目的是合成1,所以让某一天获得的数字等于1即可,即对下面的表达式进行化简:
x a 2 + y b 2 ( x + y ) a b = 1 ⇒ x a 2 + y b 2 − x a b − y a b = 0 ⇒ x ( a 2 − a b ) + y ( b 2 − a b ) = 0 ⇒ ( x a − y b ) ( a − b ) = 0 ⇒ a = b 或 x a = y b a = b 可 以 看 成 x a = y b 的 特 殊 条 件 有 a b = y x 同 时 由 于 a b 为 既 约 分 数 , 且 可 以 证 明 y x 也 为 既 约 分 数 ( 见 下 ) 即 可 得 到 a = y , b = x 由 于 x + y = 2 m , 即 a + b = 2 m \frac{xa^2+yb^2}{(x+y)ab} = 1\\ \ \\ \Rightarrow xa^2+yb^2-xab-yab=0 \\ \ \\ \Rightarrow x(a^2-ab) + y(b^2-ab)=0\\ \ \\ \Rightarrow (xa-yb)(a-b)=0 \\ \ \\ \Rightarrow a=b\ 或\ xa=yb \\ \ \\ a=b可以看成 xa=yb的特殊条件\\ \ \\ 有\frac{a}{b} = \frac{y}{x} \\ \ \\ 同时由于\frac{a}{b}为既约分数,且可以证明\frac{y}{x}也为既约分数(见下)\\ \ \\ 即可得到a=y,b=x \\ \ \\ 由于x+y=2^m,即a+b=2^m (x+y)abxa2+yb2=1 ⇒xa2+yb2−xab−yab=0 ⇒x(a2−ab)+y(b2−ab)=0 ⇒(xa−yb)(a−b)=0 ⇒a=b 或 xa=yb a=b可以看成xa=yb的特殊条件 有ba=xy 同时由于ba为既约分数,且可以证明xy也为既约分数(见下) 即可得到a=y,b=x 由于x+y=2m,即a+b=2m
下面证明 y x \frac{y}{x} xy为既约分数:证明 :
若 x , y 含 有 2 以 外 的 公 因 子 , 这 与 x + y = 2 m 矛 盾 若 x . y 均 为 偶 数 , 则 在 计 算 时 就 已 经 与 x + y 进 行 约 分 所 以 g c d ( x , y ) = 1 若x,y含有2以外的公因子,这与x+y=2^m矛盾\\ 若x.y均为偶数,则在计算时就已经与x+y进行约分\\ 所以gcd(x,y)=1 若x,y含有2以外的公因子,这与x+y=2m矛盾若x.y均为偶数,则在计算时就已经与x+y进行约分所以gcd(x,y)=1
证毕。至此全部证明结束。
AC代码
代码中用lowbit
判断是否为2的幂次
#include <bits/stdc++.h>
typedef long long llong;
typedef unsigned long long ullong;
const int N = 1e5 + 5;
using namespace std;
int a, b;
int main() {
#ifdef LOCAL
freopen("E:/code/ACM/in.in", "r", stdin);
freopen("E:/code/ACM/out.out", "w", stdout);
#endif
int T; scanf("%d", &T);
while (T--) {
scanf("%d%d", &a, &b);
int x = __gcd(a, b);
a /= x; b /= x;
puts((((a + b) & -(a + b)) == (a + b)) ? "Yes" : "No");
}
return 0;
}