ural 1057. Amount of Degrees 数位dp
2015-12-13 21:00
337 查看
题目链接
给四个数l, r, k, b。 求出在[l, r]内满足这个数可以分解成k个不同的b次方的数的个数。
只要把一个数按b进制分解, 然后找一个刚好有k个1, 其余都是0的数的个数。
好神....按B进制分解完全想不到。
给四个数l, r, k, b。 求出在[l, r]内满足这个数可以分解成k个不同的b次方的数的个数。
只要把一个数按b进制分解, 然后找一个刚好有k个1, 其余都是0的数的个数。
好神....按B进制分解完全想不到。
#include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, a, n) for(int i = a; i<n; i++) #define ull unsigned long long typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; int digit[35]; int dp[35][30], b, k; int dfs(int len, int num, int fp) { if(!len) { return num == k; } if(!fp&&dp[len][num]!=-1) { return dp[len][num]; } int maxx = fp?digit[len]:b-1, ret = 0; for(int i = 0; i<=maxx&&i<=1; i++) { ret += dfs(len-1, num+i, i==maxx&&fp); } if(!fp) return dp[len][num] = ret; return ret; } int cal(int n) { int len = 0; while(n) { digit[++len] = n%b; n/=b; } return dfs(len, 0, 1); } int main() { int A, B; while(cin>>A>>B>>k>>b) { mem1(dp); printf("%d\n", cal(B)-cal(A-1)); } return 0; }
相关文章推荐
- 第三个Sprint冲刺第九天(燃尽图)
- Hadoop 2.0 – HA功能中ZKFC对NN状态的控制
- 福昕PDF阅读器 Foxit PDF Reader 中文绿色版
- C语言总结
- eclipse提示:This tag and its children can be replaced by one <TextView/> and a compound drawable
- Combine Two Tables
- js判断安卓、ios、还是pc端
- poj_1833
- OperationResult
- 123
- log4j.xml配置详解
- java基础(包)
- cocos2d-x游戏开发 跑酷(四) 关联与物理世界
- nginx+php+redis vs nginx+lua+redis
- Java SSL/TLS 安全通讯协议介绍
- inputstream outputstream 区别
- String类的实现
- 2015 EC-Final 游记
- HDU 1874 畅通工程续
- HttpServletRequest和HttpServletResponse