藍橋杯——組合公式求值
阿新 • • 發佈:2019-02-16
問題描述 給定n, m,求:
輸入格式 輸入一行,包含兩個整數n, m。輸出格式 輸出一行,包含求得的值,由於答案可能非常大,請輸出此公式除以987654321的餘數。樣例輸入3 1樣例輸出162資料規模和約定 1<=m<=n<=10^7。
輸入格式 輸入一行,包含兩個整數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); } }