ACdreamOJ 1154 Lowbit Sum (数字dp)
ACdreamOJ 1154 Lowbit Sum (数位dp)
ACM
题目地址: pid=1154" target="_blank" style="color:rgb(0,136,204); text-decoration:none">ACdreamOJ 1154
题意:
long long ans = 0;
for(int i = 1; i <= n; i ++)
ans += lowbit(i)
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[N]; // 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;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。
ACdreamOJ 1154 Lowbit Sum (数字dp)的更多相关文章
- ACdream 1154 Lowbit Sum (数位DP)
Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...
- acdream 1154 Lowbit Sum
先贴代码,以后再写题解... 首先,直接枚举肯定是会超时的,毕竟n就有10^9那么多... 对于每个数,我们先把它转化为二进制:例:21-->10101: 对于00001~10101,可以分为几 ...
- UVA 10891 Game of Sum(DP)
This is a two player game. Initially there are n integer numbers in an array and players A and B get ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- Lowbit Sum 规律
Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSt ...
- ACDream - Lowbit Sum
先上题目: C - Lowbit Sum Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...
- HDU - 4734 F(x) (2013成都网络游戏,数字DP)
意甲冠军:求0-B见面<=F[A]所有可能的 思维:数字DP,内存搜索 #include <iostream> #include <cstring> #include & ...
- uva 10891 Game of Sum(区间dp)
题目连接:10891 - Game of Sum 题目大意:有n个数字排成一条直线,然后有两个小伙伴来玩游戏, 每个小伙伴每次可以从两端(左或右)中的任意一端取走一个或若干个数(获得价值为取走数之和) ...
- Minimum Path Sum(DFS,DP)
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
随机推荐
- 安卓Menu键的问题
近期开发中有须要Menu键,结果发现了一个非常尴尬的问题.我的測试机上有Menu键.可是測试平板上没有,队友的測试机上竟然也没有Menu键.这着实有些尴尬... 上网谷歌之后才发现问题所在: 仅仅有在 ...
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6618363 在Android系统中,每一个应用 ...
- Struts2中的ActionContext
ActionContext(Action上下文) ActionContext介绍 通过上面用户注册例子的学习,我们知道Xwork与Web无关性,我们的Action不用去依赖于任何Web容器,不用和那些 ...
- hdu1166 经典线段入门
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- Niagara AX之axvelocity的使用
axvelocity是一个Web模板引擎模块,来源于Apache Velocity.由于我的Niagara AX的许可没有axvelocity,因此,在palette中没有找到axvelocity. ...
- 用CSS截断字符串
方法一: <div style="width:300px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;&q ...
- html file选中图片后 不经过服务器 立刻显示在页面
html结构中 file类型加上 onchange事件 ,用FileReader读取图片的data:/images,然后显示在img标签中, 代码如下: <img class="pre ...
- wdcp/wdlinux 在 UBUNTU/linux 中安装失败原因之创建用户
根本原因在于安装时创建的用户www 使用了和ubuntu已创建的用户,冲突了自然创建不了用户. 你可以修改lanmp.sh脚本中创建www用户时的代码,将1000改为其他数字. 也可以修改当前用户的U ...
- 400 bad request
这是查到的Http400状态码的定义 400 错误请求 - 请求中有语法问题,或不能满足请求. HTTP 400 - 请求无效. 表单传入的参数 userNa ...
- 深入学习微框架Spring-boot
深入学习微框架:Spring Boot 深入学习微框架:Spring Boot