小明開了一家糖果店。
他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。
糖果不能拆包賣。
小朋友來買糖的時候,他就用這兩種包裝來組合。
當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。
你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。
大於17的任何數字都可以用4和7組合出來。
本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。
輸入格式
兩個正整數 n,mn,m,表示每種包裝中糖的顆數。
輸出格式
一個正整數,表示最大不能買到的糖數。
數據範圍
2≤n,m≤1000
保證數據一定有解。輸入樣例:
4 7
輸出樣例:
17
分析:
由題目的意思可以把思路往最大公約數上靠攏。很顯然當兩個數不互質時,由於最大的無法表示的數->無窮,所以必然不存在最大的無法表示的數(想想高數裏的極限,趨向於無窮相當於不存在)。而只有當兩數互質,才存在。
做法:
本題主要在於推導公式發現規律,代碼較爲簡單,這也是推導公式這一類型數學題目的慣常樣式。若一開始很難找出規律,可以試着打表(所謂打表就是利用暴力的方法在一定的範圍內打出足夠多的樣例,通過這些樣例推導公式,尋找規律,暴力搜索可以作爲打表的利器,n重循環看似無腦有時候往往不好寫,搜索寫熟練了就會發現搜索也挺無腦的)。打完表利用對稱的性質可以推出(n-1)(m-1)-1。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
bool dfs(int x,int p,int q)
{
if(!x) return true;
if(x >= p && dfs(x-p,p,q)) return true;
if(x >= q && dfs(x-q,p,q)) {return true;}
return false;
}
int main()
{
int m,n;
cin>>n>>m;
cout<<(n-1)*(m-1) -1;
}