HDU 3943 K-th Nya Number
来源:互联网 发布:网络电玩数据修改 编辑:程序博客网 时间:2024/05/17 03:11
Problem Description
Arcueid likes nya number very much.
A nya number is the number which has exactly X fours and Y sevens(If X=2 and Y=3 , 172441277 and 47770142 are nya numbers.But 14777 is not a nya number ,because it has only 1 four).
Now, Arcueid wants to know the K-th nya number which is greater than P and not greater than Q.
Input
The first line contains a positive integer T (T<=100), indicates there are T test cases.
The second line contains 4 non-negative integers: P,Q,X and Y separated by spaces.
( 0<=X+Y<=20 , 0< P<=Q <2^63)
The third line contains an integer N(1<=N<=100).
Then here comes N queries.
Each of them contains an integer K_i (0
#include <cmath>#include <ctime>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <string>#include <vector>#include <deque>#include <list>#include <queue>#include <stack>#include <map>#include <set>#include <numeric>#include <utility>#include <algorithm>#include <functional>using namespace std;typedef long long ll;const int maxn = 30;ll dp[maxn][10][22][22];int T, X, Y, N;ll P, Q, K;void init() { memset(dp, 0, sizeof(dp)); for(int i = 0; i <= 9; ++i) { if(i == 4) { dp[1][4][1][0] = 1; } else if(i == 7) { dp[1][7][0][1] = 1; } else { dp[1][i][0][0] = 1; } } for(int i = 2; i <= 20; ++i) { for(int j = 0; j <= 9; ++j) { for(int x1 = 0; x1 <= 20; ++x1) { for(int x2 = 0; x2 <= 20; ++x2) { for(int k = 0; k <= 9; ++k) { if(j == 4) { if(x1 > 0) { dp[i][j][x1][x2] += dp[i-1][k][x1-1][x2]; } else { dp[i][j][x1][x2] = 0; } } else if(j == 7) { if(x2 > 0) { dp[i][j][x1][x2] += dp[i-1][k][x1][x2-1]; } else { dp[i][j][x1][x2] = 0; } } else { dp[i][j][x1][x2] += dp[i-1][k][x1][x2]; } } } } } } return ;}int bit[30], blen;bool check(int x, int y) { for(int i = 0; i < blen; ++i) { if(bit[i] == 4) x--; if(bit[i] == 7) y--; } return x == 0 && y == 0;}ll dfs(ll pos, int num4, int num7) { if(pos < 0) { return check(X, Y) ? 1 : 0; } if(num4 < 0) return 0; if(num7 < 0) return 0; ll ret = 0; for(int i = 0; i < bit[pos]; ++i) { ret += dp[pos+1][i][num4][num7]; } if(bit[pos] == 4) num4--; if(bit[pos] == 7) num7--; ret += dfs(pos - 1, num4, num7); return ret;}ll solve(ll x) { blen = 0; while(x) { bit[blen++] = x % 10; x /= 10; } return dfs(blen-1, X, Y);}int main() { //freopen("aa.in", "r", stdin); init(); int kcase = 0; ll n1, n2, ans; scanf("%d", &T); while(T--) { kcase++; scanf("%I64d %I64d %d %d", &P, &Q, &X, &Y); n1 = solve(P); scanf("%d", &N); printf("Case #%d:\n", kcase); for(int i = 1; i <= N; ++i) { scanf("%I64d\n", &K); ll l = P + 1, r = Q, mid; ans = -1; while(l <= r) { mid = (l + r) / 2; n2 = solve(mid); if(n2 - n1 >= K) { if(ans == -1) ans = mid; else ans = min(ans, mid); r = mid - 1; } else { l = mid + 1; } } if(ans == -1) { printf("Nya!\n"); } else { printf("%I64d\n", ans); } } } return 0;}
0 0
- hdu 3943 K-th Nya Number
- HDU 3943 K-th Nya Number
- HDU 3943 K-th Nya Number (数位DP)
- [数位dp] hdu 3943 K-th Nya Number
- 【HDU】3943 K-th Nya Number 数位DP
- 【数位DP】【hdu 3943】K-th Nya Number
- HDU 3943 K-th Nya Number(数位DP + 构造)
- HDU 3943 K-th Nya Number(数位dp+二分)
- HDU 3943 K-th Nya Number [数位DP]
- hdu 3943 K-th Nya Number 数位dp
- HDU3943.K-th Nya Number
- HDOJ3943 K-th Nya Number
- HDU 3943 —— K-th Nya Number(数位DP,二分答案)
- hdu 3943 K-th Nya Number 2011多校11 数位dp
- HDU3943 K-th Nya Number 数位DP
- K-th Number HDU
- HDU3943 K-th Nya Number(数位DP)
- 【HDU3943】【K-th Nya Number】【数位+二分找位置】
- CentOS 7 下使用 Firewall
- SIFT学习笔记之一 下载和调用
- 解决Andriod软键盘出现把原来的布局给顶上去的方法
- kmeans聚类的简介和代码(python)
- MVC5开发前端框架AngularJS快速入门之Service
- HDU 3943 K-th Nya Number
- Eclipse小技巧--快速输入System.out.println();
- 广义表的原子统计
- SIFT算法实现理解及注释详解(基于Rob Hess源码)
- centos7 firewalld配置示例
- hello csdn
- 在VS2010中应用SIFT(C)源码
- ListView控件:(2)SimpleAdapter适配器生成
- android上FragmentTabHost实现自定义Tab Indicator