URAL 数位DP
2015-09-22 11:17
393 查看
URAL 1057
题目链接:
http://acm.timus.ru/problem.aspx?space=1&num=1057
题意:
问在区间[x,y]内,能用k个不同的数、且都是b的次幂的和表示的数有几个。
思路:
看着题解来的,数位DP。
分析知答案满足区间减法,所以只用求[0,y] - [0,x-1]即可。
问题转化为,求区间[0,n]的满足的数的个数。
很容易想到把[0,n]内的数全部转化为b进制下的表示,然后查询这些表示中有多少个表示是满足
1)表示中只有0、1
2)表示中1的个数为k个。
容易知道,n关于b进制的表示是这些表示中的最大值,然后就可以用类似数位dp的思想去做了。对于当前位置数值c
1)c > 1。则关于当前位置及以后都能随意取1,直接输出
2)c == 1。存在当前位置的1取还是不取的情况。不取,则当前位置的后一个位置都能随意取1。取,则k’ = k - 1,然后继续往下dp。得到的两个值想加。
源码:
题目链接:
http://acm.timus.ru/problem.aspx?space=1&num=1057
题意:
问在区间[x,y]内,能用k个不同的数、且都是b的次幂的和表示的数有几个。
思路:
看着题解来的,数位DP。
分析知答案满足区间减法,所以只用求[0,y] - [0,x-1]即可。
问题转化为,求区间[0,n]的满足的数的个数。
很容易想到把[0,n]内的数全部转化为b进制下的表示,然后查询这些表示中有多少个表示是满足
1)表示中只有0、1
2)表示中1的个数为k个。
容易知道,n关于b进制的表示是这些表示中的最大值,然后就可以用类似数位dp的思想去做了。对于当前位置数值c
1)c > 1。则关于当前位置及以后都能随意取1,直接输出
2)c == 1。存在当前位置的1取还是不取的情况。不取,则当前位置的后一个位置都能随意取1。取,则k’ = k - 1,然后继续往下dp。得到的两个值想加。
源码:
[code]"""C++ #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <iostream> using namespace std; #define LL long long const int MAXN = 35; LL dp[MAXN][MAXN]; ///first deep, second number void init() { memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for(int i = 1 ; i < MAXN ; i++){ dp[i][0] = 1; for(int j = 1 ; j <= i ; j++){ dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]; } } // for(int i = 0 ; i < MAXN ; i++){ // printf("i = %d dp = ", i); // for(int j = 0 ; j < MAXN ; j++) // printf("%I64d ", dp[i][j]); // printf("\n"); // } } int data[MAXN], cnt; LL solve(int n, int k, int b) { // printf("n = %d\n", n); cnt = 0; while(n){ data[cnt++] = n % b; n /= b; } LL ans = 0; int mark = 0; for(int i = cnt - 1 ; i >= 0 ; i--){ if(data[i] == 1){ ans += dp[i][k - mark]; mark++; } else if(data[i] > 1){ ans += dp[i + 1][k - mark]; break; } if(mark == k) break; } if(mark == k) ans++; return ans; } int main() { init(); int x, y, k, b; while(scanf("%d%d%d%d", &x, &y, &k, &b) != EOF){ LL t1 = solve(x - 1, k, b); LL t2 = solve(y, k, b); cout << t2 - t1 << endl; } return 0; } """
相关文章推荐
- Hive UDF函数
- 哈达玛(Hadamard)矩阵
- javascript 异步调用 后台.cs里的方法 PageMethods如何使用
- IE浏览器解决margin:0 auto;不居中办法!
- 遍历json的方式
- 纯js选项卡切换
- 如何去绘制一个圆并且转为imageView格式
- Spring事务配置的五种方式
- jquery选择器 ID不能有点 .
- 远程连接Ubuntu9 服务器 (putty)ssh 连接
- linux之ps命令详解
- hdu5446 Unknown Treasure(数论综合题:大组合数取大合数模:Lucas+CRT)
- iOS9问题备忘
- VS2010与水晶报表V13的打包集成小结
- 【ajax跨域】原因原理解决
- php类获取静态变量值以及调用
- 热更新-Android与Lua相互通信
- XMLItergration.java
- java.io.IOException: Stream closed
- Android App性能信息获取方法