ztr喜欢幸运数字,他对于幸运数字有两个要求
1:十进制表示法下只包含4、7
2:十进制表示法下4和7的数量相等
比如47,474477就是
而4,744,467则不是
现在ztr想知道最小的但不小于n的幸运数字是多少
有T组数据,(T<=10^5),n<=10^18
思路:
因为2^19小于10^6,所以我们可以把所有的数全部预处理存起来,然后每次查询就是找比他大的数是哪一个就可以了,这里有一个坑点就是最后输出的数可能超过long long的范围,但是只有一种情况,就是输出44444444447777777777的时候,可以特判一下
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <ctime> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f #define inf -0x3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define mem0(a) memset(a,0,sizeof(a)) #define mem1(a) memset(a,-1,sizeof(a)) #define mem(a, b) memset(a, b, sizeof(a)) typedef long long ll; char s[100]; ll num[66197]; int cnt=0; void dfs(int cnt1,int cnt2,int len,ll number){ if(cnt1==len&&cnt2==len){ num[cnt++]=number; return ; } if(cnt1<len) dfs(cnt1+1,cnt2,len,number*10+4); if(cnt2<len) dfs(cnt1,cnt2+1,len,number*10+7); } int main(){ int _; for(int i=1;i<=9;i++) dfs(0,0,i,0); scanf("%d",&_); while(_--){ ll n; scanf("%lld",&n); if(n>num[cnt-1]) puts("44444444447777777777"); else{ int id=lower_bound(num,num+cnt,n)-num; printf("%lld\n",num[id]); } } return 0; }