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. SQL学习笔记:基础SQL语句

    目录 语句特点 进入数据库 基本查询语句 SELECT DISTINCT WHERE AND/OR/NOT :逻辑运算符 ORDER BY :排序 基本修改语句 INSERT:添加语句 UPDATE: ...

  2. JS权威指南笔记1

    1.JavaScript数据类型可分为两种:原始类型和对象类型.原始类型下又包括数字.字符串和布尔值,以及null和undefined这两个特殊的:对象是属性的集合,且每个属性都有自己的"名 ...

  3. Java面试题大全(javaSe,HTML,CSS,js,Spring框架等)

    目录 1. Java基础部分 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2.Java有没有goto? 7 3.说说&和& ...

  4. Codeforces 263B. Appleman and Card Game

    B. Appleman and Card Game time limit per test  1 second memory limit per test  256 megabytes input  ...

  5. NYOJ 832 合并游戏

    合并游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 大家都知道Yougth除了热爱编程之外,他还有一个爱好就是喜欢玩.某天在河边玩耍的时候,他发现了一种神奇的石 ...

  6. BNUOJ 2528 Mayor's posters

    Mayor's posters Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Origin ...

  7. How to automate PowerPoint using VB

    Microsoft has an article that explains how to automate PowerPoint using VB For some odd reason they' ...

  8. Linux & Filesystem Hierarchy Standard

    Linux & Filesystem Hierarchy Standard The Filesystem Hierarchy Standard of Linux https://zhuanla ...

  9. 五语言学习系列 C,C++,Objective-C,Java,C# (一)历史

    C:由AT&T贝尔实验室的Dennis Ritchie于1972年创建的,是专为开发者设计的语言. C++:在C基础上,1983年又由贝尔实验室的Bjarne Strou-strup推出了C+ ...

  10. 多Tabs的横向滚动插件(支持Zepto和jQuery)

    一. 效果图 二. 功能介绍 1. 支持横向移动 2. 支持点击Tab后该Tab居中 3. 拉到最左边和最右边后依然可以拉动,只是tabs的移动距离变小. 三. 使用说明 1. 在你的html中添加T ...