题目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. Java 注解 (Annotation)

    Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java 注解是从 Java5 开始添加到 Java 的. 注解语法 ...

  2. iOS:自定义字体

    转自: <iOS tips: Custom Fonts> Post by Steve Vlaminck My good friend google told me that using a ...

  3. Apache TomEE 入门指南

    介绍 Apache TomEE(发音同“tommy”)是一个新的JavaEE服务器,由Apache软件基金会开发,你大概能够从它的名字猜到,它是从Tomcat而来, 同时加入的JavaEE的特征:To ...

  4. 如何解析本地和线上XML文件获取相应的内容

    一.使用Dom解析本地XML 1.本地XML文件为:test.xml <?xml version="1.0" encoding="UTF-8"?> ...

  5. 编译并使用带有OpenCL模块的OpenCV for android SDK

    OpenCV Android SDK中提供的静态.动态库是不支持OpenCL加速的,如果在程序中调用OpenCL相关函数,编译时不会报错,但运行时logcat会输出如下信息,提示OpenCL函数不可用 ...

  6. 安装配置和使用HBASE Cluster(基于发行版CDH5.0.2)——系列随笔

    本系列文章只是记录了笔者本人在学习实验安装和使用基于CDH5.0.2的HBASE集群过程中的一些经验教训和心得,绝不是详细的安装过程,因本人不过一初学者,很多方面不甚了了,如果能让不幸读到的人有所得则 ...

  7. 通过tarball形式安装HBASE Cluster(CDH5.0.2)——重新编译CDH5.0.2 HADOOP点滴

    本文参考博文Hadoop2.2.0遇到64位操作系统平台报错,重新编译Hadoop 由于我采用的tarball方式安装hadoop,其lib/native下根本没有内容,启动hdfs时报这个经典的na ...

  8. VIM复制粘贴大全[转]

    用vim这么久 了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开编辑,真的不 爽:上次论坛上有人问到了怎么在vim中使 ...

  9. RMAN:简单的duplicate创建新数据库 for 12c+

    构建参数文件 *.db_name='test2' ##### 需要注意的地方,和rman的duplicate目标库一致 *.compatible='18.0.0' ##### 关键的地方,每个版本的模 ...

  10. Ubuntu16.04下安装CUDA8.0和tensorflow

    GPU版的Tensorflow无疑是深度学习的一大神器,当然caffe之类的框架也可以用GPU来加速训练. 注意:以下安装默认为python2.7 1. 安装依赖包 $ sudo apt-get in ...