为什么N 要加1 ,为什么计算的小于N 的所有数?!!为什么!!!??为什么??!!!!
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int MAXN = 30;
LL dp[MAXN][3];
//dp[i][0] indicate i bits without 49
//dp[i][1] indicate i bits without 49 but start with 9
//dp[i][2] indicate i bits with 49 in it
int T;
LL n;
int num[MAXN];
void init()
{
dp[0][0]=1;
for(int i=1;i<MAXN;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];
}
num[0]=0;
}
void solve()
{
scanf("%I64d",&n);
n++;
int len = 1;
while(n)
{
num[len++]=n%10;
n/=10;
}
num[len]=0;
len--;
LL ans = 0;
bool flag =false;
for(int i=len;i;i--)
{
ans += dp[i-1][2]*num[i];
if(flag) ans += dp[i-1][0]*num[i];
if(!flag && num[i]>4) ans += dp[i-1][1];
if(num[i+1]==4&&num[i]==9)flag = true;
}
printf("%I64d\n",ans);
}
int main()
{
freopen("data.in","r",stdin);
init();
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}