lowbit

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

long long ans = 0;
for(int i = 1; i < = n; i ++)
ans += lowbit(i)
lowbit(i)的意思是将i转化成二进制数之后,只保留最低位的1及其后面的0,截断前面的内容,然后再转成10进制数
比如lowbit(7),7的二进制位是111,lowbit(7) = 1,6 = 110(2),lowbit(6) = 2,同理lowbit(4) = 4,lowbit(12) = 4,lowbit(2) = 2,lowbit(8) = 8,每输入一个n,求ans

Input:

多组数据,每组数据一个n(1 <= n <= 5*10^8)

Output:

每组数据输出一行,对应的ans.

Sample Input:

1
2
3

Sample Output:

1
3
4
解题思路:lowbit函数来源于树状数组,其含义是得到该数的二进制从右往左第一个非0位所表示的10进制数。这道题直接暴力枚举相加肯定是会超时的,因此需要推导一下有无求和公式。首先简单暴力输出前1000个数的lowbit值,其中int lowbit(int x){return x&-x;}发现有如下规律:
3 5 7 9 ...... lowbit(i)=20
2 6 10 14 18 ......lowbit(i)=21
12 20 28 36 ......lowbit(i)=22
24 40 56 72 ......lowbit(i)=23
从上表中,可以知道每一行的lowbit值是相等的。
拿n=9举个栗子:第一行有5个数,ans+=5*1,ans=5;第二行中有2个数,ans+=2*2,ans=9;第三行中有1个数,ans+=1*4,ans=13;第四行中有1个数,ans+=1*8,ans=21;求和完毕。现在的问题就是求解每一行有多少个lowbit值相等的数字,从所举栗子来看,假设p是所在行的lowbit值的指数,每一行有mp个数(数字的大小在n的范围内),则p=0时,m0=(9-20)/(20+1)+1=8/2+1=5;当p=1时,m1=(9-21)/(21+1)+1=7/4+1=2;当p=2时,m2=(9-22)/(22+1)+1=5/8+1=1;当p=3时,m3=(9-23)/(23+1)+1=1/16+1=1。而(int)log2(9)=3,即刚好枚举到p=3这一行,所以每一行在n的范围内相同lowbit值的数字求和公式为∑((n-2i)/(2i+1)+1)*2i,OK,推导完毕!
AC代码:
 #include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n){
int p=log2(n);long long ans=;
for(int i=;i<=p;++i)
ans+=((n-(<<i))/(<<(i+))+)*(<<i);
cout<<ans<<endl;
}
return ;
}

注意:左移<<运算符的优先级比双目运算符-还低,因此要加括号。

ACM_lowbit的更多相关文章

随机推荐

  1. [bzoj2431][HAOI2009][逆序对数列] (dp计数)

    Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...

  2. Python异常捕捉的一个小问题

    问题: names = ['taotao','songwenjing','liu','li']I = iter(names)while True: try: s = next(I) except Ex ...

  3. 关于 CMSIS 标准 及 STM32F10x的固件库

    CMSIS 标准英文全称是Cortex MicroController Software Interface Standard,翻译为中文意思就是 ARM Cortex 微控制器软件接口标准. 由于基 ...

  4. noip模拟赛 戏

    [问题背景]zhx 和他的妹子(们) 做游戏.[问题描述]考虑 N 个人玩一个游戏,任意两个人之间进行一场游戏(共 N*(N-1)/2 场),且每场一定能分出胜负.现在, 你需要在其中找到三个人构成“ ...

  5. [bzoj1040][ZJOI2007]骑士(环套树DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1040 分析:第一感觉肯定是树形DP,但可惜不是树.仔细分析,这个图很特殊,每个联通块肯 ...

  6. 9、Java并发性和多线程-线程安全与共享资源

    以下内容转自http://ifeve.com/thread-safety/: 允许被多个线程同时执行的代码称作线程安全的代码.线程安全的代码不包含竞态条件.当多个线程同时更新共享资源时会引发竞态条件. ...

  7. 如何在eclipse中用maven编译

    在eclipse中用maven编译的方法: 在项目中的“pom.xml”文件上点击右键,在弹出的菜单中选择“Run AS”à“Maveninstall”来编译和生成项目.如下图所示: 在编译和生成过程 ...

  8. postgresql vacuum table

    2down vote according to Documentation VACUUM reclaims storage occupied by dead tuples. But according ...

  9. 【转】gcov lcov 覆盖c/c++项目入门

    原文: http://www.cnblogs.com/turtle-fly/archive/2013/01/09/2851474.html ------------------------------ ...

  10. 使用IDA破解TraceMe.exe

    我发现用IDA破解TraceMe.exe比ODeasy多了. 打开IDA 后.直接搜索"序列号".得到 双击跳转到反汇编窗体,按F5转换为类C++代码 signed int __s ...