1. 程式人生 > >藍橋杯 買不到的數目 ( 裴蜀定理 )

藍橋杯 買不到的數目 ( 裴蜀定理 )

情況 sof 糖果 解法 格式 splay 數量 gcd ++

題意 :

小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。

小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。

你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。

本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。

輸入格式

兩個正整數,表示每種包裝中糖的顆數(都不多於1000)

輸出格式

一個正整數,表示最大不能買到的糖數

樣例輸入1

4 7

樣例輸出1

17

樣例輸入2

3 5

樣例輸出2

7

分析 :

首先題目說漏了一些東西

即給出的兩個數是互質的

網上的解法大多為 a * b - a - b

如果 a 和 b 沒有互質、那就掛了、例如 a = 2、 b = 4

然後來探討一下這個公式是怎麽來的

首先你要知道裴蜀定理即 ax + by

這個不定方程的解、永遠是 gcd(a、b) 的倍數、c = k*gcd(a,b)

但是問題就在於解出來的 x 和 y 可以是負整數

那麽有沒有什麽辦法在 x 和 y 都是正數的情況下

解出最小的 c

這裏有一個定理

當 gcd(a,b) == 1 的時候、c > a*b-a-b 時、方程有正整數解

所以在 x 和 y 為正整數的時候、組合不出來的數必定是 < a*b-a-b

那麽最大的當然就是 a*b-a-b 了

當然一切都要 gcd(a,b) == 1

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
int main(void)
{ int a, b; while(cin>>a>>b) cout<<a*b-a-b<<endl; return 0; }
View Code

藍橋杯 買不到的數目 ( 裴蜀定理 )