数位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; }