の桁数を とします。 桁の良い数を全探索することを考えましょう。
良い数に使われている数字は 種類のみであり、 種類のみの数字として代表的なものとして、 進数があります。
また、 進数の を 、 を に変換すれば良い数に変換することができます。
桁の二進数は、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; }