题目链接:点击打开链接
题意:
求[1~n] 中的数字包含 49 序列的个数;
理解:
数位dp啦;
模板一套就行;
参考:这个链接
代码如下:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MIN_INF = 1e-7;
const int MAX_INF = (1e9) + 7;
#define X first
#define Y second
LL dp[30][11];
void init() {
dp[0][0] = 1;
for (int i = 1; i < 20; ++i) {
for (int j = 0; j < 10; ++j) {
for (int k = 0; k < 10; ++k) {
if (!(j == 4 && k == 9)) {
dp[i][j] += dp[i - 1][k]; //以 j 开头的 i 位数的满足条件的数的个数
}
}
}
}
}
LL slove(LL n) {
vector<int> d;
while (n) {
d.push_back(n % 10);
n /= 10;
}
d.push_back(0);
LL ans = 0;
for (int i = d.size() - 2; i >= 0; --i) {
for (int j = 0; j < d[i]; ++j) {
if (!(j == 9 && d[i + 1] == 4)) {
ans += dp[i + 1][j];
}
}
if (d[i] == 9 && d[i + 1] == 4) {
break;
}
}
return ans;
}
int main() {
init();
int t;
cin >> t;
while (t--) {
LL n;
cin >> n;
cout << n - slove(n + 1) + 1 << endl;
}
return 0;
}