渣渣不会数位dp(伤心死了。。。)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; long long dp[22][3]; int main() { int i,j,k,l,m; long long sum,n; int a[111]; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(i=1; i<22; i++) { dp[i][0]=10*dp[i-1][0]-dp[i-1][1]; dp[i][1]=dp[i-1][0]; dp[i][2]=10*dp[i-1][2]+dp[i-1][1]; } cin>>k; while(k--) { scanf("%I64d",&n); memset(a,0,sizeof(a)); l=1; sum=0; while(n) { a[l++]=n%10; n/=10; } int flag=0; for(i=l-1; i>=1; i--) { sum+=a[i]*dp[i-1][2]; if(flag) sum+=a[i]*dp[i-1][0]; else if(a[i]>4) sum+=dp[i-1][1]; if(a[i]==9&&a[i+1]==4) flag=1; } if(flag) sum++; printf("%I64d\n",sum); } }