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 ...
随机推荐
- jQuery Pagination Ajax分页插件中文详解(摘)
jQuery Pagination Ajax分页插件中文详解 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxin ...
- hdu 1728 逃离迷宫(dFS+优先队列)
求转弯最少的走路方式!!!! #include<stdio.h> #include<string.h> #include<queue> using namespac ...
- iOS开发CoreAnimation解读之三——几种常用Layer的使用解析
iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一.CAEmitterLayer 二.CAGradientLayer 三.CAReplicatorLayer 四.CASh ...
- javascript的本地存储 cookies、localStorage
一.cookies 本地存储 首先是常用的cookies方法,网上有很多相关的代码以及w3cSchool cookies. // 存储cookies function setCookie(name,v ...
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Oracle - 找不到原因的无效字符
当执行Oracle语句时,提示“无效字符”,而语句并无错误时,尝试把语句中的空格替换成半角状态的. 一般直接复制的语句会出现这种问题.
- Win7刷新环境变量
在“我的电脑”->“属性”->“高级”->“环境变量”中增加或修改环境变量后,需重启系统才能使之生效.有没有什么方法可让它即时生效呢? 下面介绍一种方法: 以修改环境变量“PATH” ...
- HttpURLConnection 下载代码
private int downloadFile(final String apkurl, final String apkname) { Log.e(LOGTAG, "downloadAp ...
- React-Native OpenGL体验一
昨天初体验了一把SVG一个并不是多么复杂的动画,我在iOS模拟器上体验的是流畅的,但是在Android真机上体验,还是比较卡的. 下面来介绍一个OpenGL的第三方库: 下面是我运行的里面Demo的效 ...
- tabbar加小红点
原文 http://blog.csdn.net/u013531246/article/details/44460115 #import <UIKit/UIKit.h> @interfa ...