AcWing 1205. 买不到的数目
题面:
水果糖被包成颗一包和 颗一包的两种,用这两种包装来组合,不能拆包卖。
在颗一包和 颗一包的情况下,最大不能买到的数量是 。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
数论:组合数学
存在两个正整数
和 ,有这样一个组合 ( 倍的 和 倍的 ),
试问其无法组成的数中最大的一个是?
标准解法:裴蜀定理
公式:
然而,关于数论题,当我们对该题涉及的公式没有概念时,如何突破困境?
分析思路
是否有解:考虑最大公约数(gcd)
当
打表找规律
#include<bits/stdc++.h> using namespace std; //暴力法一:(6/11) bool dfs(int i, int n, int m) { //如果余数为0,则可以组合 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; cin >> n >> m; int res = 0; //设一个较大数(此处为1000),若超过就认为其有解 for (int i = 1; i <= n * m; i++) if (!dfs(i, n, m)) res = i; cout << res << endl; } //暴力法二:(9/11) int main() { int n, m; bool flag; cin >> n >> m; int res = min(n, m) - 1; for (int i = min(n, m); i < n * m; i++) { flag = false; for (int j = 0; j * n <= i; j++) { if ((i - j * n) % m == 0) { flag = true; break; } } if (!flag) res = i; } cout << res; }
简单DP优化[1]
如果
#include<bits/stdc++.h> using namespace std; const int N = 1e6 + 5; int n, m, res = 1; bool dp[N]; int main() { cin >> n >> m; dp[0] = true; if (n > m) swap(n, m); for (int i = n; i < n * m; i++) { if (dp[i - n]) dp[i] = true; else if (i >= m && dp[i - m]) dp[i] = true; else res = i; } cout << res; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!