下1桁だけに注目すればいい。
与えられた数と同じ下1桁を持つ数を4と7から作る。
class TheNumbersWithLuckyLastDigit { public: int find(int m) { const int inf = 1 << 25; const int N = 10; pair<int, int> n[N]; fill(n, n + 10, make_pair(inf, inf)); n[4] = make_pair(1, 4); n[7] = make_pair(1, 7); for (int loop = 100; loop--; ) { for (int i = 0; i < (int)N; ++i) { pair<int, int> p; int j; j = (i + 4) % N; p = make_pair(n[i].first + 1, n[i].second + 4); n[j] = min(n[j], p); j = (i + 7) % N; p = make_pair(n[i].first + 1, n[i].second + 7); n[j] = min(n[j], p); } } int x = m % 10; if (m < n[x].second) return -1; return n[x].first; } };