【题目分析】
数位DP
【代码】
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
long long dp[31][3]; //0含49 1首位为 9 2 不含 49
void init()
{
memset(dp,0,sizeof dp);
dp[0][2]=1;
for (long long i=1;i<=30;++i)
{
dp[i][0]=dp[i-1][1]+dp[i-1][0]*10;
dp[i][1]=dp[i-1][2];
dp[i][2]=dp[i-1][2]*10-dp[i-1][1];
}
}
long long query(long long x)
{
long long num[30],top=0;
memset(num,0,sizeof num);
while (x)
{
num[++top]=x%10;
x/=10;
}
long long flag=0; long long ans=0;
for (long long i=top;i;--i)
{
ans+=num[i]*dp[i-1][0];
if (!flag)
{
if (num[i]>4) ans+=dp[i-1][1];
// if (num[i+1]==4&&num[i]==9) ans+=dp[i-1][0];
}
else
{
ans+=dp[i-1][2]*num[i];
}
if (num[i]==9&&num[i+1]==4) flag=1;
}
return ans;
}
int main()
{
init();
// cout<<dp[3][0]<<endl;
long long tt;
long long n;
scanf("%d",&tt);
while (tt--)
{
scanf("%lld",&n);
printf("%lld\n",query(n+1));
}
}