题目链接:1205. 买不到的数目
小明开了一家糖果店。
他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数 n,m,表示每种包装中糖的颗数。
输出格式
一个正整数,表示最大不能买到的糖数。
数据范围
2≤n,m≤1000,保证数据一定有解。
输入样例:
4 7
输出样例:
17
解法:
可以先暴力枚举打表,然后找规律
//暴力枚举
#include <iostream>
using namespace std;
int res, p, q;
bool dfs(int m, int p, int q) {
if(m == 0) return true;if(m >= p && dfs(m - p, p, q)) return true;if(m >= q && dfs(m - q, p, q)) return true;return false;
}
int main() {
cin>>p>>q;for(int i = 1; i < 1000; i++) {
if(!dfs(i, p, q))res = i; }cout<<res;return 0;
}
正确解答:
本题中p和q一定互质,因为根据裴蜀定理,如果p和q不互质,则一定存在整数x和y,使得xp + yq为m的倍数。
本题的结论:如果 a,b 均是正整数且互质,那么由 ax+by,x≥0,y≥0 不能凑出的最大数是 (a?1)(b?1)?1。
证明可参考:AcWing 525. 小凯的疑惑
#include <iostream>
using namespace std;
int p, q;
int main() {
cin>>p>>q;cout<<(p - 1) * (q - 1) - 1;return 0;
}