题目链接: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; }