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 ...
随机推荐
- 在Unity3d编辑器中加入菜单以及菜单项
在引用UZGUI插件时,u3d编辑器的菜单条发生了变化,新增了菜单和菜单项,于是乎自己也像尝试一下,看了EZGUI的About_EZ_GUI脚本文件后,结果大出我所料,原来SO EASY! using ...
- [HDU 1317]XYZZY[SPFA变形][最长路]
题意: 一个图, 点权代表走到该点可获得的能量值. 可正可负. 一个人从1 号出发,带有100点能量. 问是否有一种方案可使人在能量值>0的时候走到n. 思路: 这个题首先要注意点权. 其实就是 ...
- NET基础课--NET的一些概念0
0.CIL--公共中间语言 VC++:经过预编译,编译,汇编和链接生成本地可执行代码,支持它运行的是OS和本地cpu指令集. C#: 在.net框架下类似c#的高级语言经过编译生成的文件叫程序集 ...
- Asp.net Mvc 请求是如何到达 MvcHandler的——UrlRoutingModule、MvcRouteHandler分析,并造个轮子
这个是转载自:http://www.cnblogs.com/keyindex/archive/2012/08/11/2634005.html(那个比较容易忘记,希望博主不要生气的) 前言 本文假定读者 ...
- baidu地图让多个标注出现在最佳视野
原文:http://www.cnblogs.com/milkmap/archive/2011/08/23/2150641.html 摘要: “我有一堆标注,不规则的散落在地图的各个地方,我想把它们展示 ...
- 子元素用margin-top 为什么反而作用在父元素上?对使用margin-top 的元素本身不起作用?
在这个说明中,“collapsing margins”(折叠margin)的意思是:2个或以上盒模型之间(关系可以是相邻或嵌套)相邻的margin属性(这之间不能有非空内容.padding区域.bor ...
- java 数字补齐0
String str_f = str.substring(0, 1); int i = (Integer.parseInt(str.substring(1)) + 1); // 数字补齐0 Decim ...
- Hdu1090
#include <stdio.h> int main() { int i,T,a,b; scanf("%d",&T); ;i<T;i++){ scanf ...
- Sticks(Central Europe 1995) (DFS)
Sticks(Central Europe 1995) Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d &am ...
- bug的处理流程
又属于一篇普及文,希望自己在被各种技术吸引的同时,能时常来整理和总结软件测试最基本的知识. 从刚工作时接触的第一个缺陷管理工具禅道,到redmine.JIRA.bugzilla ,再到现在的QC,当然 ...