题意:统计0~n的数中有多少个数含有连续的49。
思路:数位dp,dp(i,j)表示i位j开头的数中有多少个含“49”。统计的时候对每一位统计0~该位-1的结果,如果数本身出现49,则把49之后的数通通算上。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#include <sstream>
#define INF 1000000
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define MAXN 100010
using namespace std;
__int64 dp[20][10];
int main() {
dp[0][0]=0;
for(int i=2;i<=19;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++){
if(j==4&&k==9){
int s=i-2;
__int64 t=1;
while(s--)t*=10;
dp[i][j]+=t;
continue;
}
dp[i][j]+=dp[i-1][k];
}
}
}
int t;
cin>>t;
__int64 n;
while(t--){
cin>>n;
n++;
stringstream ss;
string str;
ss<<n;
ss>>str;
__int64 ans=0;
for(int i=0;i<str.size();i++){
for(int j=0;j<str[i]-48;j++){
ans+=dp[str.size()-i][j];
}
if(i>0&&str[i-1]=='4'&&str[i]=='9'){
__int64 tmp=0;
for(int k=i+1;k<str.size();k++){
tmp*=10;
tmp+=str[k]-48;
}
ans+=tmp;
break;
}
}
cout<<ans<<endl;
}
return 0;
}