HDU 4919 Exclusive or (数论 or 打表找规律)
2016-07-27 17:34
471 查看
Exclusive or
题目链接:
http://acm.hust.edu.cn/vjudge/contest/121336#problem/JDescription
Given n, find the value of![](https://images2015.cnblogs.com/blog/764119/201607/764119-20160727173205716-1195180172.png)
Note: ♁ denotes bitwise exclusive-or.
Input
The input consists of several tests. For each tests:A single integer n (2≤n<10^500).
Output
For each tests:A single integer, the value of the sum.
Sample Input
34
Sample Output
64
题意:
求如题所示的和,n的范围是1e500.题解:
数据这么大肯定要找规律.先尝试打出前100个数的表,然后找规律....(弱鸡并不能找出来)
先安利一个网站(http://oeis.org/)这是一个在线整数数列查询网站.
搜一下果然有:(http://oeis.org/A006582)
公式为:a(0)=a(1)=0, a(2n) = 2a(n)+2a(n-1)+4n-4, a(2n+1) = 4a(n)+6n.
由于是个递归公式,可以用dfs来计算,用map去重后应该是O(lgn).
一开始用cpp的大数模版一直出现各种问题(版不太熟悉),干脆复习一下java语法.
网上找到一份题解有推导过程:
![](https://images2015.cnblogs.com/blog/764119/201607/764119-20160727173231216-901294503.png)
代码:
import java.math.BigInteger; import java.util.HashMap; import java.util.Scanner; public class Main { public static HashMap<BigInteger, BigInteger> myMap = new HashMap<BigInteger,BigInteger>(); public static BigInteger [] num = new BigInteger[10]; public static BigInteger dfs(BigInteger x) { if(x == num[0] || x== num[1]) return num[0]; if(myMap.containsKey(x))return myMap.get(x); if(x.mod(num[2]) == num[0]) { BigInteger n = x.divide(num[2]); BigInteger tmp = num[2].multiply(dfs(n).add(dfs(n.subtract(num[1])))).add(num[4].multiply(n.subtract(num[1]))); myMap.put(x, tmp); return tmp; } else { BigInteger n = (x.subtract(num[1])).divide(num[2]); BigInteger tmp = num[4].multiply(dfs(n)).add(num[6].multiply(n)); myMap.put(x, tmp); return tmp; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); for(int i=0; i<10; i++) { num[i] = BigInteger.valueOf(i); } while(scanner.hasNext()){ myMap.clear(); BigInteger n = scanner.nextBigInteger(); BigInteger ans = dfs(n); System.out.println(ans); } scanner.close(); } }
相关文章推荐
- XMLA连接器--免费但不开源通过ODBO、XMLA
- Window.focus()让页面成为当前窗体
- boost的单例模式
- 一个项目搞明白Android 启动模式和taskAffinity
- Python 之 多线程
- 组合逻辑和时序逻辑
- AngularJS入门教程之表格实例详解
- ie8上创建闭包失败
- Ignite 整理
- 关于Visual Assist X遇到初始化失败的问题
- 通过交换两个数组的元素,使数组元素和之差最小
- Hadoop分布式框架搭建
- Material Design for Developers
- 模拟实现strcpy
- centos mariadb5.5升级到10.0
- ssh环境搭建并实现登录功能
- java定时器
- 强大的sscanf
- cubietruck制作刷新lubuntu-kernel
- 深入浅出JMS