hdu3555 Bomb
传送门
题意
计算([1,n](1leq nleq 2^{63}-1))中有多少数含有49
题解
数位(dp)
预处理边界的数位,得到边界,之后进行数位(dp),(dp[i][2])表示长度为(i),当前数位的高一位是否为(4)的不含有49的数的个数
#include<iostream>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<cstring>
#include<string>
#include<sstream>
#include<cmath>
#include<ctime>
#include<climits>
#include<algorithm>
#define LL long long
#define ULL unsigned long long
#define PII pair<int,int>
#define PLL pair<LL,LL>
#define PLI pair<LL,int>
#define PDI pair<double,int>
#define pi acos(-1.0)
#define eps 1e-15
#define lowbit(x) x&(-x)
using namespace std;
int T,digit[20];
LL n,dp[20][2];
LL dfs(int dig,bool is_4,bool lim){
if(dig==0) return dp[dig][is_4]=1;
if(!lim && dp[dig][is_4]) return dp[dig][is_4];
int up_bound=(lim?digit[dig]:9);
LL cnt=0;
for(int i=0;i<=up_bound;i++){
if(is_4 && i==9) continue;
cnt+=dfs(dig-1,i==4,lim && i==up_bound);
}
if(!lim) dp[dig][is_4]=cnt;
return cnt;
}
LL solve(){
int k=0;
while(n){
digit[++k]=n%10;
n/=10;
}
return dfs(k,false,true);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%lld",&n);
printf("%lld
",n+1-solve());
}
}