题目大意

给你\(n\)个数\(a_1, a_2 ... a_n\), 要你求最大的正整数\(m\)使得方程\(a_1 x_1 + a_2 x_2 + ... + a_n x_n = m\)无非负整数解. 题目数据满足\(a_x\)为正整数且不大于\(256\), \(n \le 10\).

Solution

先看一个定理: 对于正整数\(p\), \(q\)满足\(gcd(p, q) = 1\), 我们有\(px + qy = n\)无非负整数解的最大正整数\(n\)为\(pq - p - q\). 证明如下:

我们首先利用反证法, 证明\(px + qy \ne pq - p - q\): 我们假设存在正整数\(x\)和\(y\)使得\(px + qy = pq - p - q\), 则有

\[px + qy = pq - p - q \\
p(x + 1) + q(y + 1) = pq \\
\because gcd(p, q) = 1且p | q(y + 1) \\
\therefore p | y + 1 \\
同理, q | x + 1
\]

接着我们令\(y + 1 = pj\), \(x + 1 = qk\). 则有

\[pqk + qpj = pq \\
pq(j + k) = pq
\]

注意到\(x, y \ge 0\), 我们有\(y + 1 \ge 1\)且\(x + 1 \ge 1\), 因而\(j \ge 1\)且\(k \ge 1\). 因而\(j + k \ge 2\), 因而假设不成立.

得证.

再证明当\(n \ge pq - p - q + 1\)时原方程总有非负整数解:

我们令\(n = pq - p - q + k\), 则根据扩展欧几里得定理, 方程\(pa + qb = k\)有整数解(其中\(a\)和\(b\)中必有一个为正, 一个为负). 我们假设\(a < 0 < b\), 调整\(a\)和\(b\)的值使得\(|a| < q\). 令此时的\(a\)和\(b\)分别为\(A\)和\(B\).

回到原方程

\[px + qy = pq - p - q + k \\
px + qy = pq - p - q + Ax + By \\
p(x + 1 - A) + q(y + 1 - B) = pq
\]

根据前面的结论, 我们又有

\[p | y + 1 - B \\
q | x + 1 - A
\]

因此我们令

\[j = \frac{x + 1 - A} q \\
k = \frac{y + 1 - B} p
\]

则有

\[pq(i + j) = pq \\
i + j = 1
\]

不妨设\(i = 0\)且\(j = 1\), 则

\[\begin{cases}
y + 1 - B= 0 \\
x + 1 - A = q
\end{cases}
\]

因而

\[y = B - 1 \\
x = A + q - 1
\]

由于\(B > 0\), 因而\(B - 1 \ge 0\);

根据之前定义, 我们又有\(|A| < q\), 因而\(A + q - 1 \ge 0\)

因而原方程必有非负整数解.

好了, 现在考虑这道题怎么做233

注意到\(a\)值较小, 我们直接从0开始到\(256^2\)背包暴力即可.

我们注意到\(a\)之间并不一定互质, 但这并不影响我们枚举的范围.

#include <cstdio>
#include <cctype> const int N = 10, LIM = 256;
int a[N], f[LIM * LIM << 2];
int main()
{
int n; scanf("%d", &n);
for(int i = 0; i < n; ++ i) scanf("%d", a + i);
f[0] = 1;
for(int i = 1; i < LIM * LIM << 2; ++ i) for(int j = 0; j < n; ++ j) if(i - a[j] >= 0 && f[i - a[j]]) f[i] = 1;
int ans = 0;
for(int i = 1; i < LIM * LIM << 2; ++ i) if(! f[i]) ans = i;
printf("%d\n", ans > LIM * LIM ? 0 : ans);
}

USACO 4.1.1 麦香牛块 Beef McNuggets的更多相关文章

  1. 洛谷P2737 [USACO4.1]麦香牛块Beef McNuggets

    P2737 [USACO4.1]麦香牛块Beef McNuggets 13通过 21提交 题目提供者该用户不存在 标签USACO 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描 ...

  2. 洛谷 P2737 [USACO4.1]麦香牛块Beef McNuggets Label:一点点数论 && 背包

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  3. 洛谷——P2737 [USACO4.1]麦香牛块Beef McNuggets

    https://www.luogu.org/problemnew/show/P2737 题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办 ...

  4. [Luogu2737] [USACO4.1]麦香牛块Beef McNuggets

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  5. P2737 [USACO4.1]麦香牛块Beef McNuggets

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  6. [USACO4.1]麦香牛块Beef McNuggets 题解报告

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是"劣质的包装".& ...

  7. P2737 [USACO4.1]麦香牛块Beef McNuggets(完全背包+数论确定上界)

    题目链接:https://www.luogu.org/problem/show?pid=2737 题目大意:农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在 ...

  8. [USACO4.1]麦香牛块Beef McNuggets By cellur925

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  9. [USACO4.1]麦香牛块Beef McNuggets

    https://www.luogu.org/problemnew/show/P2737 给出n个数ai,求这n个数不能累加出的最大的数 最大的数无限大或能凑出所有的自然数则输出0 n<=10,a ...

随机推荐

  1. 【Gitlab+Jenkins+Ansible】构建自动化部署

    说明: Gitlab.Jenkins.生产服务器.测试服务器上都需要安装Git. 一.安装Gitlab 1.主机配置 IP: 10.10.10.105 OS: CentOs7. Gitlab版本:gi ...

  2. 浅谈javascript的运行机制

    积累一下这几天学的,记录一下: 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程 ...

  3. error LNK2001: unresolved external symbol ___CxxFrameHandler3

    Q:  VS2005编译的静态库, 在vc++6.0中连接出现错误 error LNK2001: unresolved external symbol ___CxxFrameHandler3 A:   ...

  4. LeetCode 62 不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ).机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角.问总共有多少条不同的路径? 示例 1: 输入: ...

  5. 【LeetCode】Merge Sorted Array(合并两个有序数组)

    这道题是LeetCode里的第88道题. 题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nu ...

  6. Linux 必要软件的安装与配置

    主要是记录一下,免得下次重装系统后又到处搜索.. 一.必要软件的安装 JDK 下载 tar.gz:http://www.oracle.com/technetwork/java/javase/downl ...

  7. [oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库

    1 form表单如何生成多选框(包含了多选框可选择内容) - Form设置班级输入框为 select多选 - 多选 class TeacherForm(Form): name = fields.Cha ...

  8. Kafka 1.0版本发布

    Kafka 1.0版本发布 1.0.0 2017年11月1日发布 源码下载: kafka-1.0.0-src.tgz(asc,sha512) 二进制下载: Scala 2.11 - kafka_2.1 ...

  9. tmux使用备忘

    创建新的session tmux 查看已有session tmux ls 进入tmux后 默认快捷键前缀为Ctrl+b,可以通过配置文件来修改 从session中断开 C-b d 给session改名 ...

  10. EPPlus(SQL导成Excel)

    使用Epplus方法把sql数据库中表的数据导出到excel中去: 需要使用EPPlus.dll引用. using System.IO; using OfficeOpenXml; public sta ...