作者:
炽热的
,
2023-03-15 23:18:04
,
所有人可见
,
阅读 28
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long i64;
int len;
int nums[21];
i64 f[21][10];
i64 dfs(int pos, int pre, int limit) {
if (!pos) return 1;
if (!limit && ~f[pos][pre]) return f[pos][pre];
int up = limit ? nums[pos] : 9;
i64 res = 0;
for (int i = 0; i <= up; i ++ ) {
if (pre == 4 && i == 9) continue;
res += dfs(pos - 1, i, limit && i == up);
}
return limit ? res : f[pos][pre] = res;
}
i64 calc(i64 x) {
len = 0;
i64 t = x;
memset(f, -1, sizeof f);
while (x) nums[ ++ len] = x % 10, x /= 10;
return t + 1 - dfs(len, 0, 1);
}
void solve() {
i64 r;
scanf("%lld", &r);
printf("%lld\n", calc(r));
}
int main() {
int _; scanf("%d", &_);
while (_ -- ) solve();
return 0;
}