问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
思路:
据说是一个很水的题。可能是据大腿说吧。
已知a, b,求ax+by不可能组成的数的最大值。于是我转而求ax+by能组成的连续的数的最小值。
据上图,于是我需要找能使ax+by稳定+1时x和y满足的条件。于是我通过求ax-by = 1,(y减小 x增大)求出x满足的最小值x1,然后通过求by - ax = 1
(y增大,x减小)求出最小值y1,然后这组解说明只有当x>=x1 或者 y>=y1的时候原式才能稳定+1。所以a*(x1-1) + b*(y1-1) 就是能组成的连续数列的最小值。
减1即为不能组成的数的最大值。
以上是大腿的思路。
然后。看看看。
大腿为什么那里会说错呢。就是我认为的,+1和-1的问题。
真心不是故意刷屏的呢,终于理解了大腿的脑洞感觉好开心。
T_T 真希望自己有大腿那么机智的脑袋~~~
/* 据说是一个很水的题。可能是据大腿说吧。 已知a, b,求ax+by不可能组成的数的最大值。于是我转而求ax+by能组成的连续的数的最小值。 据上图,于是我需要找能使ax+by稳定+1时x和y满足的条件。于是我通过求ax-by = 1,(y减小 x增大)求出x满足的最小值x1,然后通过求by - ax = 1 (y增大,x减小)求出最小值y1,然后这组解说明只有当x>=x1 或者 y>=y1的时候原式才能稳定+1。所以a*(x1-1) + b*(y1-1) 就是能组成的连续数列的最小值。 减1即为不能组成的数的最大值。 */ #include <stdio.h> #include <string.h> #include <iostream> using namespace std; int get(int a, int b) { for (int i=0; ; ++i) { if ((b*i + 1) % a == 0) { //cout << i << "==" << (b*i+1)/a << endl; return (b*i+1)/a ; } } } int main() { int a, b; while(cin >> a >> b) { int x = get(a, b); int y = get(b, a); // cout << x << " " << y << endl; int ans = a*(x-1) + b*(y-1) - 1; cout << ans << endl; } return 0; }