P3330 [ZJOI2011] 看电影 题解

前言

  • 非常好的思维题,使我的 \(Python\) 能力提升

\(solve\)

  • 神仙思维题
  • 可以先判掉 \(n > k\),一定不合法
  • 首先我们考虑总方案数,因为你本来求概率就要比上一个方案数
  • 方案数就是 \(n\) 个人在 \(k\) 个位置随便坐,就是 \(k^n\)
  • 然后考虑合法方案数
  • 你发现这个只向右进行到头停止非常难弄,因为你并不知道那些地方有人、哪些没人、随机到的位置的后面到尾巴有没有空座位
  • 所以我们设法解除这个限制
  • 我们加一个虚空座位 \(k+1\),令其与 \(1\) 相连,即将 \(1\)\(k\) 个座位通过 \(k+1\) 接成一个环
  • 然后我们直接加入人,由于 \(k+1\) 的存在,即使在原限制存在的情况下也会有地方坐,所有人都有坐
  • 那这不就没法算合法情况了吗
  • 一个方案合法,当且仅当这个方案中 \(k+1\) 没人坐为合法,那我们可以从这里下手
  • 我们忽略位置编号,所有方案数有 \((k+1)^{n-1}\) 种,因为我们忽略了编号,在所有 \((k+1)^n\) 的情况中,会有在环里完全一致的情况(因为是环,可能的断点有 \(k+1\) 个),所以除一个 \(k+1\),即 \({(k+1)^n} \over {k+1}\)
  • 然后对于合法的情况,上面说了 \(k+1\) 不能有人,所以我们直接在环里选一个空位置当 \(k+1\),此时方案必定合法,在 \(k+1\) 个位置坐了 \(n\) 个,剩下 \(k+1-n\) 个,合法方案数为 \((k+1)^{n-1} \times (k+1-n)\)
  • 所以答案为

\[x = (k+1)^{n-1} \times (k+1-n)\>,\>\>y = k^n \]

\[x \over y \]

  • 然后最抽象的来了,柿子很简单,但是没取模,这玩意要上高精
  • 高精是不可能高精的,这辈子都不可能高精的
  • 所以我们用 \(Python\) 直接创
  • \(10\)
点击查看代码
import math
T=int(input())
for i in range(T) :
    n,k=map(int,input().split())
    if n>k :
        print("0 1")
        continue
    x=(k+1)**(n-1)*(k+1-n);y=k**n
    g=math.gcd(x,y)
    print(x//g,y//g)
posted @ 2026-09-03 22:11  msjing  阅读(10)  评论(0)    收藏  举报