hdu 4927 Java大数

http://acm.hdu.edu.cn/showproblem.php?pid=4927

【解法】:最后的结果是C(n-1,0)*a[n] -C(n-1, 1) * a[n-1] ……C(n-1,n-1)*a[1]。符号位一正一负交替。

因为n有3000 之大,算C(n,i) 时要用到大数。

诶  其实早就把公式推出来了,就是坑在Java语言不熟悉,在编译的时候总是出现这个

我们一直以为是语法错误,但是又发现有什么地方写错了,卡了几个小时,人都要抓狂了。

今天拿着后面过的代码跟第一个交的比较才发现是数组里少求了一个值,所以一直提醒不能拿这个值再做运算。

好吧 Java还是够强大。虽然这次经验满不愉快的但还是长了经验啦。

 1 //package 大数;
 2
 3 import java.io.*;
 4 import java.math.BigInteger;
 5 import java.util.*;
 6
 7 public class Main {
 8
 9     public static void main(String[] args) {
10         Scanner sc =new Scanner(System.in);
11         int t;
12         BigInteger f[]=new BigInteger[3002];
13         BigInteger a,b,ans,w,one;
14         t=sc.nextInt();
15         while((t--)!=0)
16         {
17             int n;
18             n=sc.nextInt();
19             a=BigInteger.valueOf(n-1);
20             f[1]=new BigInteger("1");
21             f[n]=f[1];
22             for(int i=2;i<=(n+1)/2;i++)
23             {
24                 f[i]=a;
25                 f[n-i+1]=a;
26                 a=a.multiply(BigInteger.valueOf(n-i));
27                 a=a.divide(BigInteger.valueOf(i));
28             }
29             ans=new BigInteger("0");
30             int ss=(n-1)%2;
31             for(int i=1; i<=n; i++)
32             {
33                 w=sc.nextBigInteger();
34                 if(ss==0){
35                     ans=ans.add(w.multiply(f[i]));
36                     ss=1;
37                 }
38                 else{
39                     ans=ans.subtract(w.multiply(f[i]));
40                     ss=0;
41                 }
42             }
43           System.out.println(ans);
44         }
45     }
46 }

hdu 4927 Java大数

时间: 2024-10-10 05:23:47

hdu 4927 Java大数的相关文章

多校第六场 HDU 4927 JAVA大数类

题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊,现在对组合算比较什么了-- import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Sca

hdu 4927 java求组合数(大数)

import java.util.Scanner; import java.math.BigInteger; public class Main { private static int [] a = new int[3005]; private static int T; private static int n; public static void solve() { BigInteger rs = BigInteger.ZERO; BigInteger temp = BigInteger

HDU 5050 Java 大数类+读入二进制

http://acm.hdu.edu.cn/showproblem.php?pid=5050 才知道 原来JAVA这么好用,连二进制都封装好了 in.nextBigInteger(2)  就是按二进制读入 当然a.gcd(b).toString(2)  是按二进制输出一个二进制String,  a,b是大数 另外,JAVA交代码原来是class Main import java.math.BigInteger; import java.util.Scanner; public class Mai

hdu 1002 Java 大数 加法

http://acm.hdu.edu.cn/showproblem.php?pid=1002 PE   因为最后一个CASE不需要输出空行 import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner in = new Scanner(System.in); int ncase; ncase = in.nextIn

hdu 4927 java程序

/*对于本题题意非常easy 关键在于求杨辉三角时的二项式是没实用到优化,导致超时. 对于第n行的二项式的第i个可有第i-1个乘于一个数处于一个数得到,要用到大数.java比較方便. 假如n=6,i=4; C(n,i)=C(n,i-1)*(n-i+1)/i; */ import java.io.*; import java.math.*; import java.util.*; import java.text.*; public class Main { public static void

HDU 4927 Series 1 java大数

java mle前会wa 或者 t 这种事我会乱说? import java.math.*; import java.util.*; import java.io.*; public class Main { BigInteger[] a = new BigInteger[3007]; public void work() { int T; T = cin.nextInt(); while (T-- > 0) { int n; n = cin.nextInt(); for (int i = 0;

hdu 4927 Series 1(组合,java大数)

http://acm.hdu.edu.cn/showproblem.php?pid=4927 比赛时分分钟推出来公式后,陷入无限的tle中.起初想处理一遍,但是3000的数量内存装不下,直接编译就不过.为了不超内存,然后又试着把三个数合并为一个,四个数合并一个,100个数合并为一个,还是TLE.. 说到底还是数学不好啊,杨辉三角的第n行的第m个数为组合数c[n-1][m-1]. 应用c[n][m] = c[n][m-1]*(n-m+1)/m,就可以快速递推出第n行的数,这样就能省去预处理的时间以

HDU 4927 Series 1(推理+大数)

HDU 4927 Series 1 题目链接 题意:给定一个序列,要求不断求差值序列,直到剩一个,输出这个数字 思路:由于有高精度一步,所以要推理一下公式,其实纸上模拟一下很容易推出公式就是一个类似杨辉三角的组合数求和,不过奇数位置是加,偶数位置是减,然后高精度过掉 代码: 本人的第一个JAVA程序^ ^ import java.util.Scanner; import java.math.BigInteger; public class Main { public static void ma

HDU 4927 Series (找规律+JAVA)

题目链接:HDU 4927 Series 题意:给出一串N个元素的序列,作为第一串序列,第二串序列是第二串序列相邻元素的查值(即Bi=Ai+1-Ai)...第三串....一直到第N-1串是序列中只有一个数. 刚开始想到模拟一发,WA了一把,推出公式,发现是二项展开的系数(正负交替).组合数,果断要大数,苦逼JAVA不会.和一起队友摸索着,又T了一发,再想到组合数的递推.终于A了 C(a-1,b)=C(a,b)*a/(b-a+1) AC代码: import java.math.BigInteger