#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
__int64 dp[20][3];
int T;
__int64 n;
void init()
{
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int i = 1; i < 20; i++)
{
dp[i][0] = dp[i-1][0]*10 - dp[i-1][1];
dp[i][1] = dp[i-1][0];
dp[i][2] = dp[i-1][2]*10 + dp[i-1][1];
}
}
__int64 solve(__int64 n)
{
int a[30];
int flag = 0;
__int64 ans = 0;
int len = 0;
while(n)
{
a[++len] = n%10;
n /= 10;
}
a[len+1] = 0;
for(int i = len; i >= 1; i--)
{
ans += dp[i-1][2]*a[i];
if(flag)
ans += dp[i-1][0]*a[i];
if(!flag && a[i] > 4)
ans += dp[i-1][1];
if(a[i+1] == 4 && a[i] == 9)
flag = 1;
}
return ans;
}
int main()
{
scanf("%d", &T);
init();
while(T--)
{
scanf("%I64d", &n);
printf("%I64d\n", solve(n+1));
}
return 0;
}
hdu 3555 数位dp
最新推荐文章于 2018-10-23 16:48:58 发布