本文共 1461 字,大约阅读时间需要 4 分钟。
要给n只猫起名字,每只猫的名字长度不能超过它给定的最大值,且名字不能重复。每个名字由小写字母组成,方案数对77797取模。
import sysdef main(): MOD = 77797 n = int(sys.stdin.readline()) a = [] for _ in range(n): x = int(sys.stdin.readline()) a.append(x) # 预处理26的幂次 di = [1] * (11) # di[0] = 1, di[1] = 26, di[2] = 26^2, ..., di[10] = 26^10 for i in range(1, 11): di[i] = (di[i-1] * 26) % MOD # 计算单独一只猫的方案数 one = [0] * (11) for i in range(1, 11): one[i] = (one[i-1] + di[i]) % MOD # 排序a数组 a.sort() ans = 1 for i in range(n): max_len = a[i] if max_len == 0: print(-1) return # 当前猫可选的方案数是 (sum_{k=1}^max_len 26^k) - (sum_{k=1}^{i} 26^k) # 即 one[max_len] - one[i] if max_len < i: print(-1) return current = (one[max_len] - one[i]) % MOD if current < 0: current += MOD ans = (ans * current) % MOD if ans == 0: print(-1) else: print(ans)if __name__ == "__main__": main() 该代码通过预处理和排序,确保每只猫的名字不重复,正确计算方案数并对取模处理,有效解决问题。
转载地址:http://evvh.baihongyu.com/