1. 程式人生 > >藍橋杯之買不到的數目(數學公式或縮小範圍+暴力)

藍橋杯之買不到的數目(數學公式或縮小範圍+暴力)

水果 col b- sample amp pac 一個 size target

Description

小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。
小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。

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

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

Input

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

Output

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

Sample Input

樣例輸入1
4 7

樣例輸入2
3 5

Sample Output

樣例輸出1
17

樣例輸出2
7

Source

藍橋杯 傳送門:https://acmore.cc/problem/LOCAL/1601 分析: 兩種方法 方法1:兩個互質的數a,b,其ax+by不能組成的最大整數為ab-a-b 如果題目給定的兩個數不互質的話,那麽任何數都能組成,所以給定的a和b一定是互質的! 方法2:假定不能組成的數為x,那麽x的範圍是[a+b-1,lcm(a,b)],直接在這個範圍內暴力即可 code:
#include<bits/stdc++.h>
using namespace
std; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } int lcm(int a,int b) { return (a*b)/gcd(a,b); } int n,m; int f(int x) { for(int i=0;i<1005;i++) { for(int j=0;j<1005;j++) { if(i*n+j*m==x) return
1; } } return 0; } int main() { cin>>n>>m; int ans=0; int k=lcm(n,m); for(int i=k;i>=n+m-1;i--) { if(f(i)==0) { ans=i; break; } } cout<<ans<<endl; return 0; }

藍橋杯之買不到的數目(數學公式或縮小範圍+暴力)