2013-team5/andrew/30/B

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
import java.util.*;
import java.math.*;
import java.io.*;

public class Main {
    static public void main(String args[]) throws Exception{
        Scanner sc = new Scanner(new File("derangements.in"));
        PrintWriter pw = new PrintWriter(new File("derangements.out"));
        int n = sc.nextInt();
        BigInteger Comb[][] = new BigInteger[210][210];
        for (int i = 0; i <= n; i++){
            Comb[i][0] = Comb[i][i] = BigInteger.valueOf(1);
            for (int j = 1; j < i; j++){
                Comb[i][j] = Comb[i - 1][j].add(Comb[i - 1][j - 1]);
            }
        }
        BigInteger D[] = new BigInteger[210];
        D[0] = BigInteger.valueOf(0);
        D[1] = BigInteger.valueOf(0);
        D[2] = BigInteger.valueOf(1);
        for (int i = 3; i <= n; i++){
            D[i] = BigInteger.valueOf(i - 1).multiply(D[i - 1].add(D[i - 2]));
        }

        BigInteger F[] = new BigInteger[210];
        F[0] = BigInteger.valueOf(1);
        for (int i = 1; i <= n; i++) F[i] = F[i - 1].multiply(BigInteger.valueOf(2));

        BigInteger ans = BigInteger.valueOf(1);
        for (int i = 0; i <= n; i++){
            ans = ans.add(Comb[n][i].multiply(D[n - i]).multiply(F[n - i]));
        }
        pw.println(ans);
        sc.close();
        pw.close();
    }
}
}}}
import java.util.*;
import java.math.*;
import java.io.*;
public class Main {
    static public void main(String args[]) throws Exception{
        Scanner sc = new Scanner(new File("derangements.in"));
        PrintWriter pw = new PrintWriter(new File("derangements.out"));
        int n = sc.nextInt();
        BigInteger Comb[][] = new BigInteger[210][210];
        for (int i = 0; i <= n; i++){
            Comb[i][0] = Comb[i][i] = BigInteger.valueOf(1);
            for (int j = 1; j < i; j++){
                Comb[i][j] = Comb[i - 1][j].add(Comb[i - 1][j - 1]);
            }
        }
        BigInteger D[] = new BigInteger[210];
        D[0] = BigInteger.valueOf(0);
        D[1] = BigInteger.valueOf(0);
        D[2] = BigInteger.valueOf(1);
        for (int i = 3; i <= n; i++){
            D[i] = BigInteger.valueOf(i - 1).multiply(D[i - 1].add(D[i - 2]));
        }
        BigInteger F[] = new BigInteger[210];
        F[0] = BigInteger.valueOf(1);
        for (int i = 1; i <= n; i++) F[i] = F[i - 1].multiply(BigInteger.valueOf(2));
        BigInteger ans = BigInteger.valueOf(1);
        for (int i = 0; i <= n; i++){
            ans = ans.add(Comb[n][i].multiply(D[n - i]).multiply(F[n - i]));
        }
        pw.println(ans);
        sc.close();
        pw.close();
    }
}