题目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. pi4j,Netbeans中togglebutton跟Jbutton的区别

    一组togglebutton中会始终有一个是按下去的状态 一组commandbutton就全部都始终都是弹起的状态

  2. Oracle:oracle 12.1.0.2 升级到12.2.0.1 后,自动任务报错:ORA-20001: Statistics Advisor: Invalid task name for the current user

    具体错误如下:关键字:ORA-12012.ORA-20001 ORA-12012: error on auto execute of job "SYS"."ORA$AT_ ...

  3. unity, WaterProDaytime注意事项。

    一,多个WaterProDaytime不要公用material. 原因是:水面material的shader(FXWaterPro.shader)引用了reflectionTexture,而水面1的r ...

  4. WPF 每次只打开一个窗口

    if(downListControl == null || downListControl.IsVisible == false) { downListControl = new DownloadLi ...

  5. Windows程序执行过程

    Windows应用程序: WinMain函数(入口函数): 1. 设计窗体类,注冊窗体类.WNDCLASS 2. 创建窗体,显示及更新窗体. 3. 消息循环. 窗体过程函数(回调函数):WindowP ...

  6. JQuery Mobile难点备忘

    1 固定header: data-position="fixed",如果仅仅是加了这个属性,当页面出现滚动条的时候点击页面内容,header还是会隐藏显示全屏,如果不需要这样,加入 ...

  7. 爬虫 测试webmagic (一)

    目标:统计斗鱼(www.douyu.com)人数 思路: 1. 目录找到douyu播出的所有游戏 http://www.douyutv.com/directory 2. 借助 chrome 定位到每个 ...

  8. 品鉴同事发来的炸金花的PHP程序代码

    今天同事发来了一个炸金花的PHP程序,这个代码实现了两个人通过各自的三张牌进行权重计算,得到分数进行比较得到谁的牌大,我觉得里面还有一些问题,代码如下: <?php /** 每张牌的分值为一个2 ...

  9. 【代码审计】iZhanCMS_v2.1 后台任意文件删除漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

  10. Python中定义函数时参数有默认值的小陷阱

    在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类 ...