题目解析
* 输入输出:输入五个整数 x,y,z,n,mx, y, z, n, mx,y,z,n,m,分别表示公鸡单价(元)、母鸡单价(元)、小鸡 zzz 只售价(元)、总预算(元)、需要购买的总鸡数;输出满足条件的购买方案总数 CCC。
* 数据范围:1≤x,y,z≤101 \leq x, y, z \leq 101≤x,y,z≤10,1≤n,m≤10001 \leq n, m \leq 10001≤n,m≤1000。数据规模较小,允许使用枚举策略。
* 复杂度要求:时间复杂度 O(n2x⋅y)O\left(\frac{n^2}{x \cdot y}\right)O(x⋅yn2 ),最坏情况下约 10610^6106 次运算,远低于 1s1\text{s}1s 限制;空间复杂度 O(1)O(1)O(1)。
* 算法知识点:枚举(暴力求解)、不定方程整数解
思路解析
这是一个典型的不定方程整数解计数问题。设购买公鸡、母鸡、小鸡的数量分别为 a,b,ca, b, ca,b,c,可列出方程组:
{a⋅x+b⋅y+cz=na+b+c=ma,b,c≥0 且为整数\begin{cases} a \cdot x + b \cdot y + \frac{c}{z} = n \\ a + b + c = m \\ a, b, c \geq 0 \text{ 且为整数} \end{cases} ⎩⎨⎧ a⋅x+b⋅y+zc =na+b+c=ma,b,c≥0 且为整数
直接三重枚举 a,b,ca, b, ca,b,c 会达到 O(m3)O(m^3)O(m3) 的复杂度,在 m=1000m=1000m=1000 时不可接受。但注意到 ccc 可由前两式推导得出,且利用花费作为枚举维度可将范围压缩至 O(n2)O(n^2)O(n2):
1. 重新定义枚举变量:设购买公鸡花费 iii 元,母鸡花费 jjj 元,则小鸡花费为 n−i−jn - i - jn−i−j 元。
* 公鸡数量:a=i/xa = i / xa=i/x
* 母鸡数量:b=j/yb = j / yb=j/y
* 小鸡数量:c=z⋅(n−i−j)c = z \cdot (n - i - j)c=z⋅(n−i−j)(因为每元可买 zzz 只)
2. 确定枚举边界:
* iii 的范围:0≤i≤n0 \leq i \leq n0≤i≤n,步长为 xxx(确保 i/xi/xi/x 为整数,避免无效状态)
* jjj 的范围:0≤j≤n−i0 \leq j \leq n - i0≤j≤n−i,步长为 yyy(剩余钱必须非负)
3. 验证可行性:计算总鸡数 cnt=ix+jy+z⋅(n−i−j)cnt = \frac{i}{x} + \frac{j}{y} + z \cdot (n - i - j)cnt=xi +yj +z⋅(n−i−j),若 cnt=mcnt = mcnt=m 则方案数 +1+1+1。
完整代码