求0-N之内 存在49的个数
先是统计了0-2^63内所有没有49的个数
n-getans(n+1)+1;
getans(n+1)统计的是 0-n内的个数
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <deque>
#include <map>
#define cler(arr, val) memset(arr, val, sizeof(arr))
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long LL;
const int MAXN = 102020;
const int MAXM = 240000;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
LL dp[20][10];
void init()
{
cler(dp,0);
dp[0][0]=(LL)1;
for(int i=1;i<=18;i++)
for(int j=0;j<=9;j++)// j表示当前位,k表示j之前一位
for(int k=0;k<=9;k++)
{
if((j==4&&k==9)) continue;//出现49
dp[i][j]+=dp[i-1][k];
}
}
LL getans(LL n)
{
LL ans=0;
int digit[20],len=0;
cler(digit,0);
while(n)
{
digit[++len]=n%10;
n/=10;
}
for(int i=len;i>=1;i--)
{
for(int j=0;j<digit[i];j++)//统计0 - digit[i]-1 上的个数,下一个i表示digit[i+1]上所有的数
{
if(j==9&&digit[i+1]==4)
continue;
ans+=dp[i][j];
}
if(digit[i]==9&&digit[i+1]==4)//出现了49接下来的数都不是了
break;
}
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
LL n,t;
cin>>t;
init();
while(t--)
{
cin>>n;
printf("%I64d\n",n-getans(n+1)+1);
}
return 0;
}