跳转至

BISHI67 穿搭大挑战

简单通过率 62.31%python3样例通过牛客 AC

牛客原题  源码

讲解章节模拟组合数学

一句话

上衣 a 件、裤子 b 条、鞋 c 双,必须忘穿其中一类,求方案数。

解题思路

这题考什么

最朴素的乘法原理 + 加法原理。 「忘穿一种」意味着恰好穿剩下的两类各一件,三种互斥情形:

  • 忘穿上衣:b * c
  • 忘穿裤子:a * c
  • 忘穿鞋 :a * b

答案 = ab + bc + c*a。三类方案不会重复(缺的那一类不同,穿搭本身就不同)。

验算样例:a=2,b=1,c=2 -> 21 + 12 + 2*2 = 2+2+4 = 8 ✓

数据规模与复杂度

T <= 1e3,a,b,c <= 1e9。每组 O(1)。 答案最大 3 * 1e18 = 3e18,尚在 int64 上界 9.22e18 之内,但已是同一量级: C++ 必须用 long long,用 int 会直接溢出;Python 的 int 是无限精度,不受影响。 题目没要求取模,所以要输出精确值。

坑在哪

  1. 题目没说取模,别自作主张 mod 1e9+7;
  2. 别把「忘穿一种」理解成「至多忘穿一种」(那还要加上 abc)—— 样例 8 = 2+2+4 明确排除了全穿的 4 种;
  3. T 到 1e3,随手用缓冲读即可。

参考实现

solutions/BISHI67.py
import sys


def main() -> None:
    data = sys.stdin.buffer.read().split()
    t = int(data[0])
    out = []
    # 第 i 组的三个数在 data[1+3i .. 3+3i],起始的 1 是跳过开头的组数 T
    for i in range(t):
        a = int(data[1 + 3 * i]); b = int(data[2 + 3 * i]); c = int(data[3 + 3 * i])
        # 三种「忘穿哪一类」互斥,各自是剩下两类的乘积,加起来就是答案
        out.append(str(a * b + b * c + c * a))
    sys.stdout.write("\n".join(out) + "\n")


main()
[:octicons-arrow-left-16: BISHI66](BISHI66.md) [BISHI68 :octicons-arrow-right-16:](BISHI68.md)