の桁数を とします。 桁の良い数を全探索することを考えましょう。
良い数に使われている数字は 種類のみであり、 種類のみの数字として代表的なものとして、 進数があります。
また、 進数の を 、 を に変換すれば良い数に変換することができます。
桁の二進数は、bit 全探索をすることにより の計算量で全通り列挙することができます。
よって、それぞれの良い数と を比較することによって 以下で最大の良い数を求めることができます。
以下の良い数で 桁のものがない場合は、 を 個並べたものが答えとなることに注意してください。
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin >> n;
string s = to_string(n);
int digit = s.size();
if(digit == 1){
if(n == 4){
cout << 4 << endl;
}else{
cout << 5 << endl;
}
return 0;
}
long long ans = 0;
for(int i = 0; i < digit - 1; i++){
ans *= 10;
ans += 5;
}
for(int bit = 0; bit < (1 << digit); bit++){
long long num = 0;
for(int i = 0; i < digit; i++){
num *= 10;
int mask = 1 << i;
if(bit & mask){
num += 4;
}else{
num += 5;
}
}
if(num <= n){
ans = max(ans, num);
}
}
cout << ans << endl;
}