题目里的题解啥都不是,根本没有可读性,还是重新写一篇题解吧
首先裴蜀定理:对于 a_1,...,a_n∈Z 不定方程 s=a_1·x_+...+a_n·x_n 有整数解的充要条件为 \gcd(a_1,...,a_n) \ | \ s 所以那么当 \gcd(a_1,...,a_n)>1 时,所有不为 \gcd(a_1,...,a_n) 的倍数的数都不能被表示,没有最大值!
所以我们在输入的时候可以计算 a_i 的最大公因数,输入完后特判 \gcd(a_1,...,a_n)≠1 的时候直接输出 0 就行了!
那么接下来我们可用 dp 来解决此题:
- 定义一个
bool
类型的 dp 数组,来存储当 s=i 时能否分解。 - 状态转移:用 j 表示当前的数,如果 j-a_i(1≤i≤n) 可以分解,则 j 也可以分解!因为,假设当 s=j-a_i 的时候的解为:
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \left\{\begin{matrix}x_1=y_1 & & \\· & & \\· & & \\· & & \\x_n=y_n & & \end{matrix}\right.
我们只需要将这里的 y_i 加一,最后的结果就是 j 了!
3.输出:我们从大往小查看每个 dp_i 如果 dp_i=0 那么这就是最大的不能表示的数了,我们输出 i 就行了。
好了,我们只剩下最后一个问题了:题目中说答案不超过 2\times 10^{9} 但是我们的 dp 数组不可能开这么大呀,这该如何解决呢?
其实我们数组只需要开 64770 就行了!这是因为:
- 当 n=2 时,最大的不能被表示的数为 a_1a_2-a_1-a_2 而为了保证有最大值所以 (a_1,a_2)=1 那么由于 (n,n-1)=1 又因为数据范围 a_i≤256 所以我们可以让 a_1=255,a_2=256 此时取到最大值 64769 所以当 n=2 时的最大的不能被表示的数为 64769 。
- 考虑 n>2 时的情况,增加更多的 a_i 只会让能表示的数的范围变大,即答案变小。
所以其实我们的 dp 数组只用开 64770 再往上的数是一定能表示的!