Problem Description
喵哈哈村子的TTT同学比较怪,他非常讨厌一类数字,是哪种呢?
就是讨厌那些含有37或者4的数
比如 21379,123485,12379。
但是他并不讨厌928357这个数,因为他即不包含37,也没有4。
现在你[L,R]的区间,问你在这个区间中,最多能够选出多少个TTT同学不讨厌的数呢?
Input
输入两个整数,表示L和R
1 <= L <= R <= 2000000000 。
Output
输出一个整数,表示选出的数的个数
Sample Input
1 10
Sample Output
9
算是学了数位dp,之前并不会,还有第二种写法,之后补上。
f[i][j]表示i位数,开头为j的符合条件的数。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int dp[11][10];
int solve(int n)
{
int a[10];
int len = 0;
while (n > 0)
{
a[++len] = n % 10;
n /= 10;
}
a[len + 1] = 0;
int ans = 0;
for (int i = len; i; i--)
{
for (int j = 0; j < a[i]; j++)
{
if (j != 4 && !(a[i + 1] == 3 && j == 7))
ans += dp[i][j];
}
if (a[i] == 4 || (a[i] == 7 && a[i + 1] == 3))
break;
}
return ans;
}
int main()
{
int i, j, m, n, ans, t, k;
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (i = 1; i <= 10; i++)
{
for (j = 0; j <= 9; j++)
{
for (k = 0; k <= 9; k++)
{
if (j == 4 || j == 3 && k == 7)continue;
else
dp[i][j] = dp[i][j] + dp[i - 1][k];
}
}
}
int l, r;
cin >> l >> r;
cout << solve(r + 1) - solve(l) << endl;
return 0;
}