HDU4919 Exclusive or(递推+记忆化搜索+大数)

来源:互联网 发布:联通网络信号差怎么办 编辑:程序博客网 时间:2024/05/22 08:28

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4919

题意:

给定n求sigma(i^(n - i)) (1<=i<=n-1)

分析:

打表后可以发现规律

1) n = 2 * k + 1;

f[n] = 4 * f[k] + 6;

2) n = 2 * k

f[n] = 2 * f[k] + 2 * f[k-1] + 4 * k - 4;

具体的证明:http://blog.csdn.net/houserabbit/article/details/38397831

 

代码如下:

//package fuck;import java.math.BigInteger;import java.util.HashMap;import java.util.Scanner;public class Main {public static HashMap<BigInteger,BigInteger>f = new HashMap<BigInteger,BigInteger>();public static BigInteger two =BigInteger.valueOf(0);public static BigInteger three = BigInteger.valueOf(6);public static BigInteger four =BigInteger.valueOf(4);public static BigInteger dfs(BigInteger n){if(f.containsKey(n)) return f.get(n);BigInteger ans;if(n.mod(BigInteger.valueOf(2)).compareTo(BigInteger.valueOf(0))==0){BigInteger tmp = n.divide(BigInteger.valueOf(2));BigInteger tmp1 = tmp.subtract(BigInteger.valueOf(1));BigInteger ans1 = dfs(tmp).multiply(BigInteger.valueOf(2));BigInteger ans2 = tmp1=dfs(tmp1).multiply(BigInteger.valueOf(2));ans = ans1.add(ans2).add(tmp.multiply(four)).subtract(four);}else{BigInteger tmp = n.divide(BigInteger.valueOf(2));BigInteger tmp2 = tmp.multiply(three);ans = dfs(tmp).multiply(four).add(tmp2);}f.put(n,ans);return ans;}    public static void main(String args[]){          Scanner cin=new Scanner(System.in);          f.put(BigInteger.ZERO, BigInteger.ZERO);          f.put(BigInteger.ONE, BigInteger.ZERO);        f.put(BigInteger.valueOf(3), BigInteger.valueOf(6));        f.put(BigInteger.valueOf(4), BigInteger.valueOf(4));        f.put(BigInteger.valueOf(5), BigInteger.valueOf(12));        while(cin.hasNext()){        BigInteger n = cin.nextBigInteger();        System.out.println(dfs(n));        }    }  }  


 

0 0