#include <bits/stdc++.h>
using namespace std;
long long dp[25][5];
int DIG[25];
long long dfs(int pos,int len,bool limit)
{
if(pos <= 0){
return len == 2 ? 1 : 0;
}
if(!limit && dp[pos][len] != -1) return dp[pos][len];
int d = limit ? DIG[pos] : 9;
long long ans = 0;
for(int i=0;i<=d;i++){
if(len == 0){
ans += dfs(pos-1,i == 4 ? 1 : 0,limit && i == d);
}
else if(len == 1){
ans += dfs(pos-1,i == 9 ? 2 : i == 4 ? 1 : 0,limit && i == d);
}
else{
ans += dfs(pos-1,len,limit && i == d);
}
}
if(!limit) dp[pos][len] = ans;
return ans;
}
long long slove(long long n)
{
int len = 0;
memset(dp,-1,sizeof(dp));
while(n){
DIG[++len]=n%10;
n /= 10;
}
return dfs(len,0,true);
}
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--){
long long n;
cin>>n;
cout<<slove(n)<<endl;
}
return 0;
}
HDU3555 数位DP入门!
最新推荐文章于 2019-04-15 09:38:10 发布