首页 > 代码库 > poj 2515 Birthday Cake

poj 2515 Birthday Cake

 1 /**
 2 大意  : 求1^m + 2^m + 3^m + 4^m +....+ n^m
 3 解题步骤:
 4 先构造从0到m的第1阶差分序列,然后以下所有2----》p阶的差分表。
 5 令C[n+1][1]=n,用递推构造C[n+1][1]~C[n+1][p+1]的组合数打个一维表;
 6 最后利用C0*C[1]+C1*C[2]+...+Cp*C[p+1]得出答案...
 7 注意: java 提交时,一定要将包名去掉,,并且类名为Main
 8 这一题就是因为多加了个包名,,一直是 runtime error。。一个多小时。。血的教训啊。。
 9 
10 **/
11 
12 import java.io.OutputStreamWriter;
13 import java.io.PrintWriter;
14 import java.math.BigInteger;
15 import java.util.Scanner;
16 
17 public class Main {
18        
19         static BigInteger h[][] = new BigInteger [150][150];
20         static BigInteger []c = new BigInteger [150];
21         public static void getc(BigInteger n,int m){
22                c[1] =n;
23                for(int i=2 ; i<=m+1 ; i++ ){
24                       c[i]= c[i-1].multiply(n.subtract(BigInteger.valueOf(i-1))).divide(BigInteger. valueOf(i));
25               }
26               
27        }
28        
29         public static void main(String[] args) {
30               Scanner cin = new Scanner(System. in);
31                int t = cin.nextInt();
32                while(t-->0){
33                      BigInteger n = cin.nextBigInteger().add(BigInteger. ONE);
34                       int m = cin.nextInt();
35                       for(int i=0; i<=m;i++)
36                             h[0][i] = BigInteger. valueOf(i).pow(m);
37                      
38                       for(int i=1;i<=m;i++){
39                             for(int j=0;j<=m-i;j++){
40                                    h[i][j] = h[i-1][j+1].subtract( h[i-1][j]);
41                            }
42                      }
43                      BigInteger ans = BigInteger. ZERO;
44                       getc(n,m);
45                       for(int i=0;i<=m;i++){
46                            ans = ans.add( h[i][0].multiply( c[i+1]));
47                      }             
48                      System. out.println(ans);
49               }
50 
51        }
52 
53 }