这道题和不要62那道题有些类似,这道题是不要出现连续的49。
思路大致一样,只是在对f数组进行初始化的时候,我们需要求的是数中不含有49的个数,然后最后利用n+1-cal(n+1)来求出正确答案,这里与我想的有些不同。
还要注意一点,要全部转化为__int64,要不然的话会WA。
#include<stdio.h>
#include<string.h>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 103
typedef __int64 ll;
ll f[maxn][maxn];
ll dig[maxn];
void init(){
f[0][0]=1;
for(int i=1;i<=20;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
if(j==4&&k==9) continue;
f[i][j]=f[i][j]+f[i-1][k];
}
}
}
}
ll cal(ll x){
ll tmp=x,t=0;
while(tmp){
dig[++t]=tmp%10;
tmp=tmp/10;
}
dig[t+1]=0;
ll ans=0;
for(int i=t;i>=1;i--){
for(int j=0;j<dig[i];j++){
if(!(dig[i+1]==4&&j==9)) ans+=f[i][j];
}
if(dig[i+1]==4&&dig[i]==9) break;
}
return ans;
}
int main(){
ll T,n;
init();
while(~scanf("%I64d",&T)){
while(T--){
scanf("%I64d",&n);
ll res=cal(n+1);
printf("%I64d\n",n+1-res);
}
}
}