Eddys --數學組合

Eddys --數學組合
Eddys --數學組合

然後我百度一下找新的解決方法
  可以這麼想,假設n個人的ac數量按從小到大排列,可以從中任選m個人(n=>m>=2),
  再把這m個人分2組(每個人都要分組),要是滿足最小ac數大於最大ac數,只需要在m
  個人中插板即可。例如: 
  m個人假如分別爲 : 
  1,2,3,4,......m-1,m (m個人的ac數從小到大排列) 
 只需在任意位置插板就可分爲符合要求的2組: 
 1,2,3......t, || t+1...m-1,m (1<=t<m) 
 則 1,2,3......t 爲一組 
 t+1,t+2,......m-1,m 爲一組 
 很明顯這樣分組符合要求,在這m人中共有m-1種分法(t取不同值) 
得到解公式:f(n)=C(2,n)+C(3,n)2+……+C(k,n)(k-1)+……C(n,n)(n-1);
ps:C(X,X)
M 這裏M的是擋板的位置數 1|23 12|3 兩種(兩組都要有人 所以忽略 |123)

Eddys --數學組合
Eddys --數學組合
做這道題的坑 除法沒保留小數點 溢出 公式代入出錯

import java.text.DecimalFormat;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            double sum = 0;
            for (int i = 2; i <= n; i++) {
                sum += kMulC(i, n) * (i - 1);
            }
            DecimalFormat df = new DecimalFormat("0");
            System.out.println(df.format(sum));
        }
    }
    public static double kMulC(int m, int n) {
        double temp = 1;
        for (int i = 1; i <= m; i++) {
            temp *= i; // m!
        }
        double temp2 = 1;
        for (int i = n - m + 1; i <= n; i++) {
            temp2 *= i;
        }
        return temp2 / temp;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章