hdu 5587 Array 数学题
2015-11-29 20:32
295 查看
Array
Time Limit: 20 SecMemory Limit: 256 MB
题目连接
http://acm.hdu.edu.cn/showproblem.php?pid=5587Description
Vicky is a magician who loves math. She has great power in copying and creating.One day she gets an array {1}。 After that, every day she copies all the numbers in the arrays she has, and puts them into the tail of the array, with a signle '0' to separat.
Vicky wants to make difference. So every number which is made today (include the 0) will be plused by one.
Vicky wonders after 100 days, what is the sum of the first M numbers.
Input
There are multiple test cases.
First line contains a single integer T, means the number of test cases.(1≤T≤2∗103)
Next T line contains, each line contains one interger M. (1≤M≤1016)
Output
For each test case,output the answer in a line.
Sample Input
3 1 3 5
Sample Output
1 4 7
HINT
题意题解:
数学题(:
首先我们先用找规律算出第i天一共能得到的和是多少:g(i)=g(i-1)+2^(i-1)
然后我们就可以递归求解了,不断地利用2的幂来进行递归
代码:
#include<iostream> #include<stdio.h> #include<vector> #include<algorithm> #include<cstring> using namespace std; vector<long long>Q; long long ans = 0; long long g[230]; void solve(long long k) { if(k<=0)return; int p = --upper_bound(Q.begin(),Q.end(),k)-Q.begin(); ans+=g[p]+k-Q[p]; solve(k-Q[p]-1); } int main() { long long T=2; Q.push_back(0); for(int i=1;i<=59;i++) { Q.push_back(T-1);//2^i-1 T*=2; } g[1]=1;long long tmp=2; for(int i=2;i<=Q.size();i++) { g[i]=2*g[i-1]+tmp;//存的是第i天的答案 tmp=tmp*2; } int t;scanf("%d",&t); for(int i=1;i<=t;i++) { long long x;scanf("%I64d",&x); ans = 0; solve(x); printf("%I64d\n",ans); } }
相关文章推荐
- 关于JavaWeb和mysql中文乱码的经验
- GNU Radio内存错误shmget (0)解决办法
- 1251_统计难题
- html/jsp 利用juicer模版添加页面标签内容
- 构建之法读书笔记
- uva 10763 Foreign Exchange
- 构建之法读书笔记
- jquery的$.ajax async使用详解
- 黑马程序员——基础笔记:初始C语言
- python以gzip header请求html数据时,response内容乱码无法解码的解决方案
- 1. WordPress 安装
- 虚拟内存及缓冲区管理
- 第八周实践
- ajax 第二节jquery版
- C++静态成员变量和静态成员函数
- 网页设计大赛第十三天
- java处理csv文件
- c语言:判断一个字符串中是否含有字符C
- datazen 备份还原
- C++ 之函数调用操作符和函数对象