Tintin 偷拿了 n 件物品(n ≤ 800),將它們重新排列且每件物品都不在原位置。求排列方案數。輸入以 -1 結束。
錯排數 D(n) 滿足遞推:
因 n ≤ 800,結果極大,需用高精度整數(Java BigInteger 或 C++ 大整數類)。
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
final int MAXN = 805;
BigInteger[] f = new BigInteger[MAXN];
f[1] = BigInteger.ZERO;
f[2] = BigInteger.ONE;
for (int i = 3; i < MAXN; i++)
f[i] = f[i-2].add(f[i-1]).multiply(BigInteger.valueOf(i-1));
Scanner in = new Scanner(System.in);
while (true) {
int n = in.nextInt();
if (n == -1) break;
System.out.println(f[n]);
}
}
}