加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

HDU_4919_Exclusive or_脑洞大开的公式题+大数

发布时间:2020-12-14 03:05:45 所属栏目:大数据 来源:网络整理
导读:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4919 http://vjudge.net/contest/view.action?cid=52719#problem/I 1.题意: 计算从k异或(n-k)的累加和,?k=1,2,3,...,n-1。 2.题解 (1)首先会使用java大数和hashmap接口 (2)YY出这个公式 f(n)=4f(

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

http://vjudge.net/contest/view.action?cid=52719#problem/I


1.题意:

计算从k异或(n-k)的累加和,?k=1,2,3,...,n-1。


2.题解

(1)首先会使用java大数和hashmap接口

(2)YY出这个公式

f(n)=4f(k)+6k..n=2k+1
f(n)=2f(k)+2f(k-1)+4k-4..n=2k


code:

import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
	//HDU 4919
	//f(n)=4f(k)+6k..n=2k+1
	//f(n)=2f(k)+2f(k-1)+4k-4..n=2k
	Map<BigInteger,BigInteger>f;
	
	BigInteger x0,x1,x2,x4,x6;
	Scanner cin;
	BigInteger dfs(BigInteger n){
		if(f.get(n)!=null) return f.get(n);
		BigInteger ans=new BigInteger("0");
		BigInteger k,k1;
		if(n.mod(x2).compareTo(x1)==0){//2k+1
			k=n.subtract(x1).divide(x2);
			ans=x4.multiply(dfs(k));
			ans=ans.add(x6.multiply(k));
		}else{//2k
			k=n.divide(x2);
			k1=k.subtract(x1);
			ans=x2.multiply(dfs(k));
			ans=ans.add(x2.multiply(dfs(k1)));
			ans=ans.add(x4.multiply(k).subtract(x4));
		}
		f.put(n,ans);
		return ans;
	}
	void work(){
		x0=new BigInteger("0");
		x1=new BigInteger("1");
		x2=new BigInteger("2");
		x4=new BigInteger("4");
		x6=new BigInteger("6");
		f=new HashMap<BigInteger,BigInteger>();
		f.put(x0,x0);
		cin=new Scanner(System.in);
		while(cin.hasNext()){
			String s=cin.next();
			System.out.println(dfs(new BigInteger(s)));
		}
	}
	public static void main(String[] args) {
		Main e = new Main();
		
		e.work();
	}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读