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

题目链接: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));
        }
    }
}
时间: 2024-07-30 06:41:03

HDU4919 Exclusive or(递推+记忆化搜索+大数)的相关文章

Bailian1664 Placing apples【递推+记忆化递归】

1664:Placing apples 总时间限制: 1000ms 内存限制: 65536kB 描述 We are going to place M same apples into N same plates. There could be some empty plates. How many methods do we have? When we have 7 applesand 3 plates, the methods, (1, 5, 1) and (5, 1, 1) are the

第五第六课------递推+记忆话搜索+搜索八皇后(思想是做梦)+各种剪枝思想

搜索是一个漫长的过程贯彻整个oi: 八皇后------- #include <bits/stdc++.h>#define inf 0x7fusing namespace std;int n,ans,a[inf],b[inf],c[inf],d[inf];void print(){ ++ans; if(ans<=3){ for(int i=1;i<=n;i++) cout<<d[i]<<" "; cout<<endl; }} v

数字三角形——递归、递推、记忆化搜索

数字三角形 描述: 有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外没个数的左下方和右下方各有一个数. 问题: 从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来.如何走才能使得这个和尽量大? 分析: 不难看出此题是一个动态的决策问题:每次有两种选择--左下或右下.如果用回溯法求出所有的可能的路线,就可以从中选出最优的路线.但和往常一样,回溯法的效率太低:一个n层数字三角形的完整路线有2^n条,当n很大时回溯法的速度将让人无法忍受.因此本题讨论用

hdu4283 You Are the One 区间dp 记忆化搜索or递推

You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3032    Accepted Submission(s): 1352 Problem Description The TV shows such as You Are the One has been very popular. In order to

动态规划 数字三角形(递归,递推,记忆化搜索)

题目要求: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的数字三角形中寻找在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径. 三角形的行数大于1小于等于100,数字为 0 - 99 输入格式: 5 //三角形行数.下面是三角形 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 解题思路: 用二维数组存放数字三角形 D[r][j] //表示第i行第j个元素的

动态规划&mdash;&mdash;数字三角形(递归or递推or记忆化搜索)

动态规划的核心就是状态和状态转移方程. 对于该题,需要用抽象的方法思考,把当前的位置(i,j)看成一个状态,然后定义状态的指标函数d(i,j)为从格子出发时能得到的最大和(包括格子本身的值). 在这个状态定义下,原问题的解就是d(i,j). 下面看一下不同状态之间如何转移.从格子(i,j)出发有两种策略.如果向左走,则到(i+1,j)后需要求"从(i+1,j)出发能得到的最大和"这一问题,即d(i+1,j). 类似的,往右走之后需要求解d(i+1,j+1).由于可以在这两个决策中自由选

由DAG到背包问题——记忆化搜索和递推两种解法

一.问题描述 物品无限的背包问题:有n种物品,每种均有无穷多个.第 i 种物品的体积为Vi,重量为Wi.选一些物品装到一个容量为 C 的背包中,求使得背包内物品总体积不超过C的前提下重量的最大值.1≤n≤100, 1≤Vi≤C≤10000, 1≤Wi≤1000000. 二.解题思路 我们可以先求体积恰好为 i 时的最大重量(设为d[i]),然后取d[i]中的最大值(i ≤ C).与之前硬币问题,"面值恰好为S"就类似了.只不过加了新属性--重量,相当于把原来的无权图改成带权图,即把&q

[hdoj]1244记忆化搜索

题解参考:http://www.cnblogs.com/peaceful-andy/archive/2012/08/14/2638907.html 很久很久以前……我一直以为记忆化搜索就是dp,dp就是记忆化搜索……多么悲哀的认识…… 动态规划是“填表格”的顺序依次递推,记忆化搜索说白了就是搜索的一种,树型,二者的相同点就是,边运行边记忆,对于计算过的都存起来,不再重复计算. 1 #include <iostream> 2 using namespace std; 3 4 const int

算法导论学习-动态规划之记忆化搜索

一. 动态规划 动态规划(dynamic programming),与“分治思想”有些相似,都是利用将问题分 为子问题,并通过合并子问题的解来获得整个问题的解.于“分治”的不同之处在 于,对于一个相同的子问题动态规划算法不会计算第二次,其实现原理是将每一个计算过的子问题的值保存在一个表中. 二. 记忆化搜索 我们常见的动态规划问题,比如流水线调度问题,矩阵链乘问题等等都是“一步接着一步解决的”,即规模为 i 的问题需要基于规模 i-1 的问题进行最优解选择,通常的递归模式为DP(i)=optim