数位DP。。。。。第一道数位DP,,但是感觉自己还弄得不是很清楚,,,,不知道到底是怎么进行的。不过原理还是有的。
#include <stdio.h>
#include <string.h>
#define ll __int64
ll dp[22][3];
int main()
{
int t;
scanf("%d",&t);
int i,j,k;
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(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];
}
while(t--)
{
ll n;
scanf("%I64d",&n);
int top=0;
ll ans=0;
int flag=0;
ll que[23];
memset(que,0,sizeof(que));
n++;
while(n)
{
que[++top]=n%10;
n=n/10;
}
// for(i=1;i<=top;i++) printf("***%d",que[i]);printf("\n");
for(i=top;i>=1;i--)
{
ans+=dp[i-1][2]*que[i];
if(flag)
{
ans+=dp[i-1][0]*que[i];
}
else
{
if(que[i]>4)
ans+=dp[i-1][1];
}
if(que[i+1]==4&&que[i]==9) flag=1;
}
// if(flag) ans++;
printf("%I64d\n",ans);
}
return 0;
}