ACdreamOJ 1154 Lowbit Sum (数字dp)
2015-09-26 18:38
344 查看
ACdreamOJ 1154 Lowbit Sum (数位dp)
ACM
题目地址:ACdreamOJ 1154
题意:
long long ans = 0;
for(int i = 1; i <= n; i ++)
ans += lowbit(i)
[/code]
lowbit(i)的意思是将i转化成二进制数之后,仅仅保留最低位的1及其后面的0,截断前面的内容,然后再转成10进制数。即lowbit(i) = i&(-i)。
每输入一个n,求ans
分析:
用二进制去考虑,能够发现这是个数位dp,假设当前第i位为1。说明这个数肯定包括i+1位的所有和。不要忘了第i位也会被求和到。
额,举个样例:
10->1010。
第一位是1。所以它肯定包括000~111,也包括1000
第二位是0,不考虑
第三位是1,包括0~1,也包括10
第四位是0,不考虑
所以我们仅仅要算出0~1, 00~11, 000~111...的和即可了
列出1~15的二进制码,发现。最后一个1在最后一位有一半,在倒数第二位的有1/4,所以依据这个规律打表即可了。
代码:
/* * Author: illuz <iilluzen[at]gmail.com> * File: 1154.cpp * Create Date: 2014-07-31 08:46:56 * Descripton: aoj 1154 */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define repf(i,a,b) for(int i=(a);i<=(b);i++) typedef long long ll; const int N = 30; ll n; ll dp ; // table void init() { repf (i, 1, N - 1) { ll ans = 0, t = (1<<i), v = 1; while (t) { ans += (t>>1) * v; // there was (t>>1) numbers whose last 1 is in log2(v) v <<= 1; t >>= 1; } dp[i] = ans; // cout << ans << ' '; } } ll solve(ll n) { int i = 0; ll ret = 0; while (n) { if (n & 1) ret += dp[i] + (1<<i); // don't forget there must be a 1<<i n >>= 1; i++; } return ret; } // brute force ll bf(ll n) { ll ans = 0; repf (i, 1, n) ans += i&(-i); return ans; } int main() { init(); while (cin >> n) { cout << solve(n) << endl; // cout << n << ' ' << solve(n) << ' ' << bf(n) << endl; } return 0; }
相关文章推荐
- Linux服务器搭建(以阿里云服务器为例)
- UVa 11795 Mega Man's Mission(集合动态规划)
- golang+litide+ubuntu环境配置
- 求两个数的公约数(gcd)
- DNS视图及日志系统
- 【从头开始学算法】快速排序
- 使用颜色渐变图片自定义条形ProgressBar
- HDU 5477 A Sweet Journey(本场的最水题,过程处理好是关键)——2015 ACM/ICPC Asia Regional Shanghai Online
- 顶点动画原理和实例之MD2FrameAnimation
- 2015年9月25日滴滴出行在线编程题
- 杭电acm--2070
- Swift - 使用下划线(_)来分隔数值中的数字
- Swift - 给游戏添加背景音乐和音效(SpriteKit游戏开发)
- VMWARE虚拟机无法访问的三种方法分析
- Event filter with query SELECT * FROM __InstanceModificationEvent WITHIN
- 1.6 CentOS7 配置AMP环境之MySQL
- Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)
- DeepMind背后的人工智能:深度学习原理初探
- 详解Java多态对象的类型转换与动态绑定
- 简单理解socket协议