藍橋杯 買不到的數目 ( 裴蜀定理 )
阿新 • • 發佈:2018-09-19
情況 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
藍橋杯 買不到的數目 ( 裴蜀定理 )