【HDU5587 BestCoder Round 64 (div1)B】【迭代 前缀和思想】Array 前m个数的二进制中共有多少个1
来源:互联网 发布:手机vpn软件 编辑:程序博客网 时间:2024/05/19 13:58
#include<stdio.h>#include<string.h>#include<ctype.h>#include<math.h>#include<iostream>#include<string>#include<set>#include<map>#include<vector>#include<queue>#include<bitset>#include<algorithm>#include<time.h>using namespace std;void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}#define MS(x,y) memset(x,y,sizeof(x))#define MC(x,y) memcpy(x,y,sizeof(x))#define MP(x,y) make_pair(x,y)#define ls o<<1#define rs o<<1|1typedef long long LL;typedef unsigned long long UL;typedef unsigned int UI;template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;}template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;}const int N=0,M=0,Z=1e9+7,ms63=1061109567;int casenum,casei;LL day[64];LL sumd[64];LL sumv[64];void init(){for(int i=1;i<=60;++i){day[i]=1ll<<i-1;sumd[i]=(1ll<<i)-1;sumv[i]=sumv[i-1]*2+day[i];}}LL cnt(LL d,int p){while(d<sumd[p])--p;//使得d>=sumv[p]LL more=d-sumd[p];LL tmp=sumv[p]+more;if(more>1)tmp+=cnt(more-1,p-1);return tmp;}int main(){init();scanf("%d",&casenum);for(casei=1;casei<=casenum;++casei){LL m;scanf("%lld",&m);printf("%lld\n",cnt(m,60));}return 0;}/*【trick&&吐槽】读题非常非常重要。这题卡了很久就是卡在题意上QwQ【题意】给你一个奇怪的数列,一开始只有{1},后来每次先添加一个0,然后把之前的数列再重复写一遍,新增的每个数再加1。问你这个数列的前m(1e16)项的和是多少。【类型】迭代 前缀和思想【分析】我们很难确定每个位置的是多少。然而事实上也不需要知道这个,我们只要知道前多少位数值的和即可。这个可以以二进制为基准倍增,权值每次*2再加上区间长度。我们处理完这个之后,每次就找前缀数值。而后面剩余的数,只是前面倍增,每个数值+1而已。于是这个时候,我们把多1的数值算过之后,把所有数映射到前面来。这样对于每个询问,我们可以在log级别求解。这样就做完啦!=========================================================然而,这道题还有值得思考的地方。就是这个数列的意义。a[i]其实表示的是i的二进制中有多少个1,你看——a[]={1,1,2,1,2,2,3,...}哇塞~~好有趣哦~~然而并不会使得我们的做题策略改变噗【时间复杂度&&优化】O(Tlogm)*/
0 0
- 【HDU5587 BestCoder Round 64 (div1)B】【迭代 前缀和思想】Array 前m个数的二进制中共有多少个1
- hdu5587 BestCoder Round #64 (div.2)
- BestCoder Round #64 (div.1) B.Array
- [ACM] POJ 3252 Round Numbers (一个区间内二进制中0的个数大于等于1的个数有多少个,组合)
- a的b次方(2≤a,b≤100)中共有多少个不同的数?
- 【HDU5654 BestCoder Round 77 (div1) D】【前驱位置思想 排序 树状数组】xiaoxin and his watermelon candy 区间内多少个不同连续单升三元
- 从1到10000的自然数中共有多少个1
- Java 欧拉工程 第二十九篇【a的b次方(2≤a,b≤100)中共有多少个不同的数】
- 欧拉工程第29题 a的b次方(2≤a,b≤100)中共有多少个不同的数
- 【HDU5569 BestCoder Round 63 (div1)B】【DP】matrix 向右走向下走最大乘积和
- 【HDU5637 BestCoder Round 74 (div1)B】【bfs预处理】Transform 15个值+17个2的幂数最小异或步数使得s变成t
- 按输入序列长度为M,按其数据二进制中 ‘1’ 的个数多少,返回前N多的元素
- uva 10892 求a,b 最小公倍数为m a,b这样的数有多少个
- 递归算法 m和A和n个B,求有多少种排列
- 【HDU5646 BestCoder Round 76 (div1)A】【贪心】DZY Loves Partition n个数拆分k个最大乘积
- 一个数字的二进制有多少个1(转)
- 计算一个数的二进制形式有多少个1
- 求整数的二进制表达中有多少个1
- java用户角色权限数据库设计
- kettle学习:JsonInput使用
- Android-Android6.0新特性-略讲1
- mysql循环结构
- hdu 计算机学院大学生程序设计竞赛(2015’11)投币洗衣机
- 【HDU5587 BestCoder Round 64 (div1)B】【迭代 前缀和思想】Array 前m个数的二进制中共有多少个1
- android.mk文件内容
- hdu 计算机学院大学生程序设计竞赛(2015’11)质方数
- hiho刷题日记——第二十五天最短路径·三:SPFA算法
- 【Eclipse for IAR】使用 Eclipse 编写 IAR 程序
- Struts2框架入门学习
- 理想的程序员
- hdu 计算机学院大学生程序设计竞赛(2015’11)油菜花王国(并查集)
- Struts2的404/500完全捕捉