题目2 : 二进制翻转

时间限制:20000ms
单点时限:1000ms
内存限制:256MB

描述

定义函数 Rev(x) 表示把 x 在二进制表示下翻转后的值

例如:

Rev(4)=1,因为 4 等于(100)B,翻转后是 (001)B,也就是 1

Rev(6)=3,因为 6 等于(110)B,翻转后是 (011)B,也就是 3

定义 Cnt(x) 表示 x 在二进制表示下 1 的个数,求:

输入

仅一行,一个非负整数 n

0 ≤ n ≤ 1015

输出

仅一行:一个非负整数表示答案

样例输入
2
样例输出
3
/*
Name: rev x& count num 1 of x in binary
Copyright: @2017 shenben
Author: shenben
Date: 25/04/17 16:47
Description:
//枚举当前要计算的数的位数,考虑从左右往中间dp
//f[i][j][k][cmp1][cmp2]表示考虑了前 i 位和后 i 位,前 i 位需要 j 个进位,后 i 位的进位为 k,前 i 位和后 i 位和上限的大小情况分别是 cmp1,cmp2
//转移时,同时枚举第 i+1 位和倒数第 i+1 位的值,枚举该位最后是否是 1 ,根据这个判断是否需要进位即可
//时间复杂度 O((logn)^2)
//(来自官方题解)
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=;
ll n,ans;int m,dig[N];
ll f[N][N][][][];
ll s[N][N][][][];
inline int fun(int b,int x,int y){
if(x==y) return b;
if(x<y) return ;
return ;
}
void solve(){
memset(f,,sizeof f);
memset(s,,sizeof s);
if(m==){ans++;return ;}
f[][][][fun(,,dig[])][]=;
f[][][][fun(,,dig[])][]=;
s[][][][fun(,,dig[])][]=;
s[][][][fun(,,dig[])][]=;
for(int i=;i<=m/;i++){
for(int j=;j<=m;j++){
for(int a=;a<;a++){
for(int b=;b<;b++){
for(int c=;c<;c++){
ll k=f[i-][j][a][b][c];
ll l=s[i-][j][a][b][c];
if(!k) continue;
//0,0
f[i][][a|(dig[m-i+]==)][fun(b,,dig[i])][]+=k;
s[i][][a|(dig[m-i+]==)][fun(b,,dig[i])][]+=l;
//0,1
f[i][j+][a|(dig[m-i+]==)][fun(b,,dig[i])][c]+=k;
s[i][j+][a|(dig[m-i+]==)][fun(b,,dig[i])][c]+=l+k*(-c);
if(a|(dig[m-i+]==)){
//1,0
f[i][j+][a][fun(b,,dig[i])][c]+=k;
s[i][j+][a][fun(b,,dig[i])][c]+=l+k*(-c);
//1,1
f[i][][a][fun(b,,dig[i])][]+=k;
s[i][][a][fun(b,,dig[i])][]+=l+k*(-j);
}
}
}
}
}
}
if(m&){
int i=m+>>;
for(int j=;j<=m;j++){
for(int a=;a<;a++){
for(int b=;b<;b++){
for(int c=;c<;c++){
ll k=f[i-][j][a][b][c];
ll l=s[i-][j][a][b][c];
if(!k) continue;
//
f[i][][a|(dig[m-i+]==)][b][]+=k;
s[i][][a|(dig[m-i+]==)][b][]+=l;
//
if(a|(dig[m-i+]==)){
f[i][][a][b][]+=k;
s[i][][a][b][]+=l+k*(-j);
}
}
}
}
}
}
int i=m+>>;
for(int j=;j<=m;j++){
for(int a=;a<;a++){
for(int b=;b<;b++){
for(int c=;c<;c++){
if(!a&&!b) continue;
ll k=f[i][j][a][b][c];
ll l=s[i][j][a][b][c];
if(!k) continue;
ans+=l;
if(c) ans-=k*j;
}
}
}
}
}
int main(){
cin>>n;
for(ll t=n;t;t>>=) dig[++m]=t&;
for(solve();--m;){
for(int i=;i<=m;i++) dig[i]=;
solve();
}
cout<<ans;
return ;
}

hihoCoder挑战赛28 题目2 : 二进制翻转的更多相关文章

  1. hihoCoder挑战赛28 题目3 : 树的方差

    题目3 : 树的方差 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 对于一棵 n 个点的带标号无根树,设 d[i] 为点 i 的度数. 定义一棵树的方差为数组 d[1. ...

  2. hihoCoder挑战赛28 题目1 : 异或排序

    题目1 : 异或排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个长度为 n 的非负整数序列 a[1..n] 你需要求有多少个非负整数 S 满足以下两个条件: ...

  3. 【hihoCoder挑战赛28 A】异或排序

    [题目链接]:http://hihocoder.com/problemset/problem/1509 [题意] [题解] 每次找到相邻两个数的二进制形式中; 不同的最高位; 显然S在这一位必然是确定 ...

  4. [题解]hihoCoder挑战赛18——题目1 神奇字符串

    题目地址:http://hihocoder.com/problemset/problem/1264 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 我们说两个字符串是非常 ...

  5. hihoCoder挑战赛11.题目4 : 高等理论计算机科学(LCA)

    clj在某场hihoCoder比赛中的一道题,表示clj的数学题实在6,这道图论貌似还算可以... 题目链接:http://hihocoder.com/problemset/problem/1167 ...

  6. hihoCoder挑战赛27题目一 福字 (dp)

    题目: 一个n × n的矩阵,其中每个位置都是一个非负整数. 一个福字被定义成是大小为 k 的正方形,满足其中的每个位置上的数都恰好比他的左边的那个和上边的那个大1(如果左边或上边的那个不存在的话就无 ...

  7. hihoCoder挑战赛23

    hihoCoder挑战赛23 A.Emulator 题意 给一张图,有\(N(N \le 300)\)个点, 给出任意两点之间的最短路. 求最多可以去掉多少条边,使得任意两点的最短路长度不变. 思路 ...

  8. hihocoder 挑战赛9 A.好配对(思维题目 防止超时)

    #1123 : 好配对 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个序列a和b,每个序列中可能含有重复的数字. 一个配对(i,j)是一个好配对当从第一个序列中选 ...

  9. hihocoder挑战赛26

    某蒟蒻成功的·写出了T1并rank16...小岛的题目真难... 传送门:http://hihocoder.com/contest/challenge26 T1 如果你想要暴力枚举的话显然是不行的 如 ...

随机推荐

  1. 小程序笔记四:表单提交form

    index.wxml代码 <form bindsubmit="formSubmit" bindreset="formReset"> <view ...

  2. SharePoint 2013 隐藏左边快速启动菜单栏(Hiding the Quick Launch Bar)

    在SharePoint 2013默认网站页面中,很多时候,我们需要隐藏左边快速启动菜单栏,这时我们可以通过下面的样式来实现隐藏它. 和SharePoint 2010不太一样,方法改了,不过性质是一样的 ...

  3. kuser_cmpxchg_check 原子操作

    对于ARM体系结构,每一个由用户态到内核态的中断或异常处理路径都经过kuser_cmpxchg_check,kuser_cmpxchg_check中检查被中断的地址是否大于TASK_SIZE:TASK ...

  4. Java基础之深入理解Class对象与反射机制

    深入理解Class对象 RRIT及Class对象的概念 RRIT(Run-Time Type Identification)运行时类型识别.在<Thinking in Java>一书第十四 ...

  5. Ubuntu下PHP动态编译出现Cannot find autoconf的解决方法

    执行phpize时出现Cannot find autoconf 错误 Ubuntu下解决方法 sudo apt-get install autoconf

  6. MathType怎么编辑半开半闭区间

    数学中的公式有很多,涉及到各种各样的样式,这些公式都会用到不同的符号,每一个符号用在不同数学问题的公式中,都会有其特定的意义,比如括号.括号这个符号在除了能够表示优先运算之外,还可以代表区间的意思,小 ...

  7. C# DataTable转实体 通用方法

    public static T GetEntity<T>(DataTable table) where T : new() { T entity = new T(); foreach (D ...

  8. Aspose------导入Excel

    代码: public List<T> ImportExcelToList<T>() { HttpContext context = HttpContext.Current; ) ...

  9. VMWARE workstation 9 收缩虚拟硬盘

    在9以前的版本中可以通过在客户机中vmtools收缩硬盘,而在9以后这个功能没有了.虚拟机中使用过的虚拟硬盘即使删除了所有数据,使用vmware workstation 9 的clean up dis ...

  10. 安装centos6.5

    我是在虚拟机上面安装的centos6.5,本机的系统是windows 2008 datacenter. 到这个地方下载镜像文件:http://mirrors.sohu.com/centos/6.5/i ...