最近在练数位dp,这题还是wang了一发,这题是基本题,没什么好说的,附上代码。
#include<stdio.h>
#include<string.h>
#define LL unsigned long long
LL dp[3][30];
LL a[30];
void init()
{
int i,j,k;
dp[0][0]=1;
for(i=1;i<22;i++)
{
dp[0][i]=dp[0][i-1]*10-dp[1][i-1];
dp[1][i]=dp[0][i-1];
dp[2][i]=dp[2][i-1]*10+dp[1][i-1];
}
}
LL solve(LL n)
{
int i,j,k,len;
for(i=1;n;i++)
{
a[i]=n%10;
n/=10;
}
len=i;
a[len]=0;
LL ans=0,flag=0;
for(i=len-1;i>0;i--)
{
ans+=a[i]*dp[2][i-1];
if(flag)ans+=a[i]*dp[0][i-1];
else
{
if(a[i]>4)ans+=dp[1][i-1];//这里刚开始写成if(a[i+1]>4)ans+=dp[0][i-1],错了一次~
}
if(a[i+1]==4&&a[i]==9)flag=1;
}
return ans;
}
int main()
{
init();
int i,j,k,t;
LL n;
scanf("%d",&t);
while(t--)
{
scanf("%I64u",&n);
printf("%I64u\n",solve(n+1));
}
return 0;
}