メモ化する。
memo[桁数][4の数][7の数][まだ一致しているか]
const int L = 11; lli memo[L][L][L][2]; string s; lli rec(int len, int _4, int _7, bool small) { if (len == s.size()) return abs(_4 - _7); if (memo[len][_4][_7][small] != -1) return memo[len][_4][_7][small]; lli sum = 0; int begin, end; if (small) { begin = 0, end = 9; } else { begin = 0, end = s[len] - '0'; } for (int i = begin; i <= end; ++i) { sum += rec(len + 1, _4 + (i == 4), _7 + (i == 7), small || i < s[len] - '0'); } return memo[len][_4][_7][small] = sum; } class SumOfLuckiness { public: long long theSum(int A, int B) { char buff[L]; fill(&memo[0][0][0][0], &memo[L - 1][L - 1][L - 1][2], -1); sprintf(buff, "%d", A - 1); s = string(buff); lli a = rec(0, 0, 0, false); fill(&memo[0][0][0][0], &memo[L - 1][L - 1][L - 1][2], -1); sprintf(buff, "%d", B); s = string(buff); lli b = rec(0, 0, 0, false); return b - a; } };
0 件のコメント :
コメントを投稿