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的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章