数位DP,各种理解难题
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define LL long long
using namespace std;
unsigned long long n;
LL f1[25],f2[25],f3[25];
int s[25];
int t;
int main()
{
cin>>t;
int i,j,k;
f1[0]=0;f2[0]=1;f3[0]=0;
for(i=1;i<=19;i++)
{
f1[i]=f1[i-1]*10+f3[i-1];
f2[i]=10*f2[i-1]-f3[i-1];
f3[i]=f2[i-1];
}
while(t--)
{
scanf("%I64d",&n);
n++;//因为判断n时只判断了n-1,比如492只判断了491就结束了,但492也是一种情况
LL sum=0;
i=0;
while(n)
{
s[i++]=n%10;
n/=10;
}
int len=i;
int num,pre=-1;
int flag=0;
for(i=len-1;i>=0;i--)
{
num=s[i];
j=i+1;
for(k=0;k<num;k++)
{
sum+=f1[j-1];
if(flag) sum+=f2[j-1];
if(!flag&&k==4) sum+=f3[j-1];//此处还要加上!flag的条件,如果flag==1那么此种情况在上一行就已经算进去了
}
if(num==9&&pre==4) flag=1;
pre=num;
}
printf("%I64d\n",sum);
}
return 0;
}