题意

有n只猫,它们可以接受不同的名字长度。问共有多少种不同的方案可以满足所有猫。

思路

  1. 首先我们知道名字长度有限,所以可以桶一下。表示接受名字长度为的猫的数量。
  2. 表示长度小于等于的小写字母组成的字符串总数。它可以这样计算
  3. 所以当存在某个时,无法分配。
  4. 如果可分配,答案为

如果觉得公式太抽象了,以样例三举例:

solution

import math
mod = 77797
n = int(input())
l = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
d = [0, 26]
for i in range(1, 11): d.append(d[i]+26**(i+1))
a = list(map(int, input().split()))
for i in a: l[i] += 1
f = 0
for i in range(1, 11):
    if l[i] > d[i]: print(-1); f = 1
    if f: break
if f == 0:
    res = 1
    s = 0
    for i in range(1, 11):
        now = math.perm(d[i]-s, l[i])
        res = now % mod*res % mod
        s += l[i]
    print(res)