#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
#define N 25
#define ll __int64
ll dp[N][3];
ll n;
//dp[i][0] 含49的
//dp[i][1] 不含49且最高位是9的
//dp[i][2] 不含49且最高位不是9的
void init()
{
int i,j;
dp[0][2]=1;
for(i=1;i<=22;i++)
{
dp[i][0]=dp[i-1][0]*10+dp[i-1][1];
dp[i][1]=dp[i-1][1]+dp[i-1][2];
dp[i][2]=dp[i-1][1]*8+dp[i-1][2]*9;
}
}
ll solve()
{
ll ret=0;
int i;
bool flag=false;
ll num[25],len=0;
while(n)
{
num[++len]=n%10;
n/=10;
}
num[len+1]=0;
for(i=len;i>=1;i--)
{
ret+=num[i]*dp[i-1][0];
if(flag)ret+=num[i]*(dp[i-1][1]+dp[i-1][2]);
else
{
if(num[i]>4)ret+=dp[i-1][1];
if(num[i]==9&&num[i+1]==4)flag=true;
}
}
if(flag)ret++;
return ret;
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
scanf("%I64d",&n);
printf("%I64d\n",solve());
}
return 0;
}
hdu 3555(数位dp)
最新推荐文章于 2016-09-11 21:53:49 发布