CF一战让我觉得很疲倦,所以今天感觉很慢。

昨天解D题时候,因为太累,根本连题目都没看,今天看了之后感觉不会做,听闻是数位DP问题。

有某神说过,DP的功力建立在刷过的题上,我真的毫无功力可言。

介绍大家一个很不错的文章。

中学生写的啊!瞬间觉得自己弱爆了……

http://wenku.baidu.com/link?url=q4atTAoZVGlV6sfo0fhED06ogbktY38_TZkGWLkuOpTRiqyI-eDyarkTeL10fv2GdUe53DMIloZ_sD0gZF6xK1ljbcJH1NlLgdyh4aVcGXi

完全根据文章所说的写,毫无问题,一次AC……

  1. /*******************************************************************************/
  2. /* OS : 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 UTC 2013 GNU/Linux
  3. * Compiler : g++ (GCC) 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  4. * Encoding : UTF8
  5. * Date : 2014-04-07
  6. * All Rights Reserved by yaolong.
  7. *****************************************************************************/
  8. /* Description: ***************************************************************
  9. *****************************************************************************/
  10. /* Analysis: ******************************************************************
  11. *****************************************************************************/
  12. /*****************************************************************************/
  13.  
  14. #include<iostream>
  15. #include<cstdio>
  16. #include<cstring>
  17. using namespace std;
  18. long long dp[40][40];
  19. long a[33];
  20. void init(){
  21. dp[0][0]=1 ;//dp[i][j],表示i位,j个1的数的个数,dp[i][j]=dp[i-1][j]+dp[i-1][j-1] 即第i位为1,第i位为0两种情况
  22. for(long i=1;i<=31;i++){
  23. dp[i][0]=dp[i-1][0]; //0个1的情况,等于第i位不是0的即dp[i-1][0].
  24. for(long j=1;j<=i;j++){
  25. dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
  26. }
  27. }
  28. }
  29. long cal(long x,long k){
  30. long cnt=0,ans=0;
  31. for(long i=31;i>0;i--){ //高位开始运算
  32. if(x&(1<<i)){
  33. cnt++;
  34. if(cnt>k) break;
  35. x=x^(1<<i); //抹掉x的目前最高位
  36.  
  37. }
  38. if((1<<(i-1))<=x){
  39. ans+=dp[i-1][k-cnt];
  40. }
  41. }
  42. if(cnt+x==k) ans++; //本身
  43. return ans;
  44.  
  45. }
  46. long turn(long n,long B){
  47. long i=0,j,res=0;
  48. while(n){
  49. a[++i]=n%B; //从1开始末位
  50. n/=B;
  51. }
  52. j=i; //最高位
  53. while(a[i]<=1){ //高位递减
  54. i--;
  55. }
  56. while(i>=1){ //将右边全部赋值为1
  57. a[i]=1;
  58. i--;
  59. }
  60.  
  61. while(j>=1){
  62. res=a[j]+(res<<1);
  63. j--;
  64.  
  65. }
  66.  
  67. return res;
  68.  
  69. }
  70. long fun(long n,long k,long b){
  71.  
  72. long X=turn(n,b);
  73. return cal(X,k);
  74.  
  75. }
  76. int main(){
  77.  
  78. long X,Y,K,B;
  79. long res;
  80. init();
  81. while(cin>>X>>Y>>K>>B){
  82. res=fun(Y,K,B)-fun(X-1,K,B);
  83. cout<<res<<endl;
  84.  
  85. }
  86.  
  87. return 0;
  88.  
  89. }

数位DP入门Ural1057的更多相关文章

  1. xbz分组题B 吉利数字 数位dp入门

    B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...

  2. 数位dp入门 hdu2089 不要62

    数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...

  3. hdu3555 Bomb 数位DP入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...

  4. HDU 2089 不要62【数位DP入门题】

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. HDU 2089 不要62(数位dp入门)

    题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 题解:这是数位DP的入门题了,首先要理解数DP的原理,DP[i][j]:代表第i位的第j值,举个栗子:如4715   数位数是从右向 ...

  6. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  7. LightOJ 1140 计数/数位DP 入门

    题意: 给出a,b求区间a,b内写下过多少个零 题解:计数问题一般都会牵扯到数位DP,DP我写的少,这道当作入门了,DFS写法有固定的模板可套用 dp[p][count] 代表在p位 且前面出现过co ...

  8. HDU-2089不要62-暴力或数位DP入门

    不要62 题意:给定区间,求在这个区间中有多少个数字,不包含4且不包含62: 这道题作为数位DP的入门题: 暴力也是可以过 #include<cstdio> #include <io ...

  9. 数位dp入门 HDU 2089 HDU 3555

    最基本的一类数位dp题,题目大意一般是在a~b的范围,满足某些要求的数字有多少个,而这些要求一般都是要包含或者不包含某些数字,或者一些带着数字性质的要求,一般来说暴力是可以解决这一类问题,可是当范围非 ...

随机推荐

  1. 解决android锁屏或解锁后activity重启的问题

    If your target build version is Honeycomb 3.2 (API Level 13) or higher you must put the screenSize f ...

  2. OS X: Keyboard shortcuts

    Using keyboard shortcuts To use a keyboard shortcut, press a modifier key at the same time as a char ...

  3. 编译android版libmpg

    环境:ubutnu 12.04,android SDK 1. 下载libmpg的一个android工程,得到一个Android-libmpg-master.zip.https://github.com ...

  4. Windows Azure功能更新: SDK 2.1发布,Traffic Manager集成

    最近,Windows Azure又进行了更新 Windows Azure SDK 2.0发布没多久,2.1版(for .NET)就在今天发布了.2.1版本在管理功能上进行了重大改进,包括Visual ...

  5. Python 函数和模块

    200 ? "200px" : this.width)!important;} --> 介绍 在python中也存在函数的概念,标准的函数我们可以叫内置函数,这类函数可以直接 ...

  6. VersionCode和VersionName

    关于apk更新版本的问题   先上结论: Google为APK定义了两个关于版本属性:VersionCode和VersionName,他们有不同的用途. VersionCode:对消费者不可见,仅用于 ...

  7. hdu2571动态规划

    125ms.... 太慢了...dp[i][j] = max(dp[i][j-1],dp[i-1][j],dp[i][k],1<k<j&&j%k==0); #include ...

  8. Callgrind 使用 2

    Callgrind是一款和gprof类似的性能分析工具,与gprof不同的是它不需要在编译源码时附加特殊选项,但推荐加上调试选项.Callgrind使用cachegrind的统计信息Ir(I cach ...

  9. 标准I/O之实现细节

    在UNIX系统中,标准I/O库最终都要调用文件I/O(read.write等).每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno函数以获得其描述符. 注意,fileno不是 ...

  10. tarball文件安装的大概流程

    ./configure这个步骤就是在创建 Makefile 这个文件罗!通常程序开发者会写一支 scripts 来检查你的 Linux 系统.相关的软件属性等等,这个步骤相当的重要, 因为未来你的安装 ...