【2021CCPC华为云挑战赛-1006】【HDU-7092】仓颉造数 数学

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+y2xyx1+y12 1x+y=21x1+y1=22 xx1 baab 12a2+b22ab2aba2+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+yb2x+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+yb2x+y=2mtabxa2+(tx)b2x+y=2m=t

证明:利用数学归纳法的思想

  1. 在第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时的特例。

  2. 在以后的某一天当中,我选取的任意两个数一定满足上述表达式,则
    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+(t1x1)b2+t2abx2a2+(t2x2)b2 =2t1t2abx1t2a2+(t1t2x1t2)b2+x2t1a2+(t1t2x2t1)b2 =2t1t2ab(x1t2+x2t1)a2+(2t1t2(x1t2+x2t1))b2 X=x1t2+x2t1,T=2t1t2: TabXa2+(TX)b2() T=2t1t2=22m12m2=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+yb2xabyab=0 x(a2ab)+y(b2ab)=0 (xayb)(ab)=0 a=b  xa=yb a=bxa=yb ba=xy baxy a=yb=x x+y=2ma+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,y2x+y=2mx.yx+ygcd(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;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值