Problem Description
ztr loves lucky numbers. Everybody knows that positive integers are lucky if their decimal representation doesn't contain digits other than 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.
Lucky number is super lucky if it's decimal representation contains equal amount of digits 4 and 7. For example, numbers 47, 7744, 474477 are super lucky and 4, 744, 467 are not.
One day ztr came across a positive integer n. Help him to find the least super lucky number which is not less than n.
Lucky number is super lucky if it's decimal representation contains equal amount of digits 4 and 7. For example, numbers 47, 7744, 474477 are super lucky and 4, 744, 467 are not.
One day ztr came across a positive integer n. Help him to find the least super lucky number which is not less than n.
Input
There are T
(1≤n≤105)
cases
For each cases:
The only line contains a positive integer n(1≤n≤1018) . This number doesn't have leading zeroes.
For each cases:
The only line contains a positive integer n(1≤n≤1018) . This number doesn't have leading zeroes.
Output
For each cases
Output the answer
Output the answer
Sample Input
2 4500 47
Sample Output
4747 47
题意:问最小的大于等于n的数,并且这个数只由4和7组成,且4和7的个数一样。
思路:直接将1~16位的所有数通过dfs打表得到,奇数位的n的答案肯定是位数加1的合法的数,但是当n大于16位最大的合法数的时候,答案是爆long long,通过特判输出。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int inf =0x3f3f3f3f;
const double pi = acos(-1.0);
const int N = 1e5 + 10;
ll s[N*5];
int k;
void dfs(ll num, int a, int b)
{
if(a+b == 19)
return ;
if(a == b && a+b)
s[k++] = num;
dfs(num*10 + 4, a+1, b);
dfs(num*10 + 7, a, b+1);
}
int main()
{
int t;
k = 0;
dfs(0, 0, 0);
sort(s, s+k);
cin>>t;
while(t--)
{
ll n;
scanf("%I64d", &n);
int sb = lower_bound(s, s+k, n) - s;
if(sb == k)
printf("44444444447777777777\n");
else printf("%I64d\n", s[sb]);
}
return 0;
}