6月模拟赛题解 积木

题目描述

原题地址

题解

对于前 20% 的数据,可以直接枚举答案,用搜索判断可不可行
对于 100% 的数据。为了方便,我们仅考虑 gcd(a,b) = 1 的情形,若 gcd(a,b)! = 1,则视每 厘米为 厘米。
此时a,b互质,稍加推测可以发现每次答案都为 a + b - 1。
下面证明这个结论。
引入一个概念 完全剩余系,若整数 a0,a1,···,am-1 满足 ai ≡ i( mod m) ,则称a0, a1, …,am-1,为模 m 的一个完全剩余系.
分两步证明这个结论.
第一步,证明 n = a + b - 1 时,能够满足条件.
有一个显然的结论,a,2a,···,(b-1)a,ba构成模b的一个完全剩余系(因为与互
质).如果某个时刻,当前位于r厘米的情况,且 r + a > n那么有 r ≥ b(n − a + b − 1),这个时候必然可以搭若干次使得 r < b,这时又可以搭 a 厘米.因为拆 b厘米并不影响 r 模 b 的结果.且每次无法拆时搭 a 厘米都会使 r 去到一个从未到达过的同余类,这表明可以一次走到每个 ia(1 ≤ i ≤ b) 所代表的同余类至少一次,其中有一种状态 s 满足 s ≡ ha ≡ b − 1( mod b),这时可以搭到 b-1 厘米,再搭一次便可达到 n = a + b - 1 厘米。此后将用类似的操作(把 a,b 倒过来考虑)可以返回地面。
第二步,证明当 n < a + b − 1 时,不能满足条件。
若能完成规定动作,从 0 厘米到 n 厘米,再回到 0 厘米,必须经过 a,2a,···(b-1)a,ba 代表的同余类各一次,设他此时在第 lb-1 级台阶,他则无法上升 a 级 a + lb − 1 ≥ a + b − 1 > n,则无法去到其他的同余类.矛盾.
那么答案即为 a+b-1,因为这里取过 gcd,所以答案实际上为 a+b-gcd(a,b)
事实上这个问题是同余理论中入门且证明过程较为精彩的问题,运用的思想在很多数论题中都有用到。

标程

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int lcm(int a,int b)
{
    return a*b/gcd(a,b);
}
int main()
{
    int a,b;
    cin>>a>>b;
    cout<<a+b-gcd(a,b);
    return 0;
}

其实找规律挺好van的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值