1. 程式人生 > >藍橋杯——組合公式求值

藍橋杯——組合公式求值

問題描述  給定n, m,求:

輸入格式  輸入一行,包含兩個整數n, m。輸出格式  輸出一行,包含求得的值,由於答案可能非常大,請輸出此公式除以987654321的餘數。樣例輸入3 1樣例輸出162資料規模和約定  1<=m<=n<=10^7。

我的思路是將Cin的值儲存在陣列中,每一個Cin的值可以通過C(i-1)n的值進行一次乘法和一次除法得到。但是即使在計算C(i-1)n的時候,計算的結果仍然非常大。結果需要取餘數,但是不能再計算得到Cin的時候就將結果取餘了,因為C(i+1)n的值需要通過Cin來計算,如果在這裡就取餘的話結果就是錯誤的。

然後,做不來......結果只有60分,我還嘗試了輸入十萬+的n值,結果就是在計算Cin的時候就出現堆溢位,因為生成的cin數字太大了,BigInteger的物件就把堆記憶體佔滿了。

有沒有大佬指點一下~

package com.huan.exam1.test7;

import java.math.BigInteger;
import java.util.Scanner;

public class Main {


    static BigInteger maxBint=new BigInteger(String.valueOf("987654321"));

    public static void main(String args[]){

        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();

        BigInteger bis[] = new BigInteger[n+1];
        bis[0]=new BigInteger(String.valueOf(n));

        for (long i=1;i<=n;i++){

            BigInteger pre=BigInteger.valueOf(n-i);
            BigInteger cin = bis[(int) (i-1)].multiply(pre).
                    divide(BigInteger.valueOf(1+i));

            bis[(int) i]=cin;
        }

        for (int i=0;i<=n;i++){
            if (bis[i].compareTo(maxBint)>0)
                bis[i]=bis[i].mod(maxBint);
        }

        BigInteger mn=bis[m-1];
        BigInteger sum=BigInteger.ZERO;

        for (int i=1;i<=n;i++){

            BigInteger bi=new BigInteger(String.valueOf(i));
            bi=bi.pow(3);
            if (bi.compareTo(maxBint)>0)
                bi=bi.mod(maxBint);

            sum = sum.add(mn.multiply(bis[i-1]).multiply(bi));
            if (sum.compareTo(maxBint)>0){
                sum=sum.mod(maxBint);
            }
        }

        System.out.println(sum);

    }
}