zoukankan      html  css  js  c++  java
  • HDU 4927 Series 1 ( 组合+高精度)

    Series 1

     

    大意:

    题意不好翻译,英文看懂也不是非常麻烦,就不翻译了。

    Problem Description
    Let A be an integral series {A1, A2, . . . , An}.

    The zero-order series of A is A itself.

    The first-order series of A is {B1, B2, . . . , Bn-1},where Bi = Ai+1 - Ai.

    The ith-order series of A is the first-order series of its (i - 1)th-order series (2<=i<=n - 1).

    Obviously, the (n - 1)th-order series of A is a single integer. Given A, figure out that integer.
     

     

    Input
    The input consists of several test cases. The first line of input gives the number of test cases T (T<=10).

    For each test case:
    The first line contains a single integer n(1<=n<=3000), which denotes the length of series A.
    The second line consists of n integers, describing A1, A2, . . . , An. (0<=Ai<=105)
     

     

    Output
    For each test case, output the required integer in a line.
     

     

    Sample Input
    2 3 1 2 3 4 1 5 7 2
     

     

    Sample Output
    0 -5
     
     
    思路:
    比赛中楠姐非常快就推出来公式了,想把杨辉三角预处理出来,然后发现BigInteger大小爆内存了。。

    。非常无语

    然后又想在暴力的基础上去优化。然后一直T到死。

    。。 比赛结束也没搞出来。

    赛后才知道。杨辉三角是能够直接用组合公式推出来的。。。
    杨辉三角的第n行的第m个数为组合数c[n-1][m-1]。
    应用c[n][m] = c[n][m-1]*(n-m+1)/m,就能够高速递推出第n行的数,这样既避免了打表会出现的爆内存。也省去了暴力好多的时间。。。。

    还是太年轻  哎。。。


    	import java.io.*;
    	import java.math.*;
    	import java.util.*;
    	public class Main {            
    		
    		static BigInteger coe[][] = new BigInteger [3010][3010];
    		public static void main(String[] args) throws IOException{
    			Scanner cin = new Scanner(System.in);
    			BigInteger []a = new BigInteger[3010];  
    	        BigInteger []c = new BigInteger[3010]; 
    			int T;
    			T = cin.nextInt();
    			while(T-- > 0){
    				int n;
    				n = cin.nextInt();
    				for(int i = 1; i <= n; ++i){
    					a[i] = cin.nextBigInteger();
    				}
    				BigInteger ans = BigInteger.ZERO;
    				c[0] = BigInteger.ONE;
    				ans = ans.add(c[0].multiply(a[n]));
    				int t = -1;
    				for(int i = 1; i < n; ++i){
    					BigInteger t1 = BigInteger.valueOf(n).subtract(BigInteger.valueOf(i));  
    	                BigInteger t2 = BigInteger.valueOf(i);
    	                c[i] = c[i-1].multiply(t1).divide(t2); 
    	                ans = ans.add(c[i].multiply(a[n-i]).multiply(BigInteger.valueOf(t)));
    	                t *= -1; 
    				}
    				System.out.println(ans);
    			}
    			
    		}
    	}
    


  • 相关阅读:
    剑指Offer--复杂链表的复制
    剑指offer--第43题 1~n整数中1出现的次数
    剑指Offer--第50题 第一次只出现一次的字符
    剑指offer--扑克牌顺子
    MySQL免安装使用教程
    TortoiseGit的使用参考
    剑指Offer-- 第58题 翻转字符串
    剑指Offer-- 第45题 把数组排成最小数
    剑指Offer-- 第49题 丑数
    SpringBoot-data-jpa的简单使用
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6719354.html
Copyright © 2011-2022 走看看