题目
有n个信封,包含n封信,现在把信拿出来,再装回去,要求每封信不能装回它原来的信封,问有多少种装法?
给定一个整数n,请返回装发个数,为了防止溢出,请返回结果Mod 1000000007的值。保证n的大小小于等于300。
测试样例:
2
返回:1
思路
f(n)=(n−1)∗(f(n−1)+f(n−2))f(n)=(n−1)∗(f(n−1)+f(n−2))
代码
class CombineByMistake:
def countWays(self, n):
# write code here
if n < 3:
return n - 1
x, y = 1, 0
for i in range(3, n + 1):
tmp = ((i - 1) * (x + y)) % 1000000007
y = x; x = tmp
return x