[蓝桥杯]买不到的数目

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 56 浏览





小明开了一家糖果店。
他别出心裁:把水果糖包成4颗一包和7颗一包的两种。
糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。
当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。
大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数 n,m表示每种包装中糖的颗数。
输出格式
一个正整数,表示最大不能买到的糖数。
2≤n,m≤1000
保证数据一定有解
输入样例
4 7

输出样例

17

#include <iostream>using namespace std;
bool dfs(int i, int n, int m){ if (!i) return true; if (i >= n && dfs(i - n, n, m)) return true; if (i >= m && dfs(i - m, n, m)) return true; return false;}
int main(){ int n, m, res; scanf("%d %d", &n, &m);
for (int i = 1; i < 1000; i++) if (!dfs(i, n, m)) res = i;
printf("%d", res); return 0;}

通过打了多组表,就发现了其具有的一些独特的规律

m
n
d
3
21
34
5
35
7
37
11
38
13
310
17

相邻组之间n每递增1,d对应的数也加1

很容易发现他是具有一种线性关系的即是(m-1)*n - m

利用输出样例,很好可以验证我们猜想,这样我们就得到了对应的答案。

最后放上代码

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;
int main(){ int n, m; scanf("%d %d", &n, &m);
printf("%d", n * m - n - m); return 0;}


题后反思

解决问题后我咨询了一位来自北京交大的大佬@锦筝叹和一位来自华师大的大佬@lzw,按照他们的思路,我们将问题转化为一个线性表达式

即是d = ay+bx

a,b要是互质的正整数,x和y要是两个自然数,如果这个数d’不能被表出,则必然d'在表示的时候x或者y必有一个为负,故我们不妨设一个数n = a-b

这样就会有了以下的证明手稿


图片


感谢来自华师大@lzw的相关推导证明



最后我们也就得到了这个题的结论,即两个互质的自然数,所不能表出的最大自然数为  a*b-a-b

图片


添加 家长论坛微信 



发布于 2024-04-26 12:52

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

广告
All Rights Reserved Powered BY WeCenter V4.1.0 © 2025 京ICP备20005761号-2