http://acm.timus.ru/problem.aspx?space=1&num=1057

其实这题可以算是一个组合数的题目了,主要是将基于其他进制转化为基于2进制的算法,对于某一位不为1的话,那么取其他位的话是一定不满足题意的,所以要找到一个数的最高位大于1,将这一位以及后面的每一位都赋值为1,然后就是一个按位DP的过程了,dp[len][statu]表示长度剩余量为len,要求1的个数为statu个时,并且对后面的位没有要求的情况下,所有可能的解。

代码如下:

#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;typedef unsigned int Int;Int x, y, k, b, bit[35];int len, dp[35][35];Int dfs(int pos, int statu, int limit)
{ if (pos == -1) {return statu == 0;}if (!limit && dp[pos][statu] != -1) return dp[pos][statu];Int sum = 0;int s, end = limit ? bit[pos] : 1;for (int i = 0; i <= end; ++i) {s = statu;if (i == 1) s = statu - 1;if (s < 0) continue;sum += dfs(pos-1, s, limit && i==end);}if (!limit) {dp[pos][statu] = sum; // 如果有限制的话,那么end的取值是并没有取全的
    }return sum;
}Int Cal(Int x)
{len = -1;while (x != 0) { bit[++len] = x % b;x /= b;}if (b != 2) {// 对于不是2进制的数,我们需要将其转化为2进制进行求解// 若一个数被表示为 a1*b^e1 + a2*b^e2 + a3*b^e3 次方,那么这个数要能成为题目中要求的数// 就要在把这个数缩小的情况下不对解带来影响,所以我们选择从高位开始的第一个系数既// 不是0又不是1的位来进行处理,并把从这一位开始的后面的所有的位都变成1,这样就是舍弃了// 一部分一定不会成为解的数,但是有会所有解空间for (int i = len; i >= 0; --i) {if (bit[i] > 1) {for (int j = i; j >= 0; --j) {bit[j] = 1;}break;}}}return dfs(len, k, 1);
}int main()
{    memset(dp, 0xff, sizeof (dp));while (scanf("%u %u %u %u", &x, &y, &k, &b) == 4) {x -= 1; printf("%u\n", Cal(y) - Cal(x));}return 0;
} 

转载于:https://www.cnblogs.com/Lyush/archive/2012/08/13/2636552.html

timus-1507 Amount of Degrees 按位DP相关推荐

  1. 【算法•日更•第十二期】信息奥赛一本通1585:【例 1】Amount of Degrees题解

    废话不多说,直接上题: 1585: [例 1]Amount of Degrees 时间限制: 1000 ms         内存限制: 524288 KB 提交数: 130     通过数: 68 ...

  2. Amount of Degrees

    ural 1057 Amount of Degrees 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K 个互不相等的B的整数次幂之和. 分析: 所求的数为互不相等的幂之和,即起B进制表 ...

  3. [压位DP]Hdu 6149——Valley Numer II

    题目梗概 给定一个无向图,图中的点存在高低. 定义山谷为:一个低点连接两个相邻的高点. 求不相交的山谷的最大个数. 解题思路 一看这个高点个数<=15高点个数就马上想到压位DP. i表示前i个点 ...

  4. 2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp

    F - 柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) ...

  5. 1026: [SCOI2009]windy数 (按位DP)

    定义windy数:相邻数字的差至少是2的数,例如10不是windy数,而13是windy数.求给定区间中有多少windy数.区间端点范围为 [1, 2000000000] dfs写法 #include ...

  6. 【按位dp】文盲的学习方法

    当年大神的文章 <浅谈数位统计问题> 对于没什么文化(x 没有充分时间或懒得看那么多理论 应付个水考试的我 eg:62问题 某大大的代码和分析 1 #include <iostrea ...

  7. LeetCode---数位DP

    简介 数位DP是一种计数的DP,一般就是要统计一个区间[l,r]内满足一些条件的个数.所谓数位DP, 意思就是在数位(个位,十位,百位,,,)上进行DP. 对于这种问题的求解思路:先得出解ans[x] ...

  8. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  9. 提高篇 第五部分 动态规划 第3章 数位动态规划

    例1 Amount of Degree(Ural 1057) URAL 1057 Amount of Degrees 数位dp_每天都要进步哦~-CSDN博客 Ural 1057. Amount of ...

最新文章

  1. 16.Hadoop架构再探讨第1部分
  2. [Redis6]发布和订阅
  3. python闯关_Day012
  4. C语言 __TIME__ - C语言零基础入门教程
  5. C++类型萃取之type_traits和type_info
  6. [VirtaulBox]网络连接设置
  7. input file获取文件路径_python 基础 — 整理文件
  8. wxpython 文本框TextCtrl
  9. 怎么修改某一软件的服务器,怎样设置一个软件服务器地址
  10. c语言多线程怎么写,如何用C语言实现多线程
  11. mock SpringMVC 测试控制器方法
  12. android仿qq空间、微信朋友圈图片展示
  13. tableau三轴该怎么做_举个栗子!Tableau技巧(30):巧妙实现 双柱图 和 折线图 的组合图表...
  14. [新功能]文章预览功能
  15. SPSS 中介效应检验(图文+数据集)【SPSS 043期】
  16. 2018版苹果开发者设置内购、税务、银行问题
  17. QML 图形渲染 - Displace
  18. 2022-11-18 mysql列存储引擎-assert failed on i < m_idx.size() at rc_attr.h:342-问题分析
  19. MyEclipse在启动了诸如Tomcat等web服务后,控制台信息不显示的问题
  20. three.js学习笔记(五)——Shadows阴影

热门文章

  1. mysql case break_按月转移日志表中日志时,mysql总是报‘MySQL server has gone away’这样的错!...
  2. 用css如何写正方体,css正方体实现--(transform练习)
  3. java swing 树_Java Swing JTree 树形
  4. 计算机网络:第六章 应用层
  5. 重庆二师计算机科学与技术,应用型本科院校计算机科学与技术专业一流课程建设思考──以重庆第二师范学院为例...
  6. java core日志在哪里_java-如何在未启用日志记录功能的情况下在...
  7. 三种方法实现Linux系统调用方法分享
  8. win服务器管理器“丢失”了怎么办?
  9. Win2003服务器设置防火墙图文教程
  10. poj3264 线段树