我们遇到数位dp题要求含什么的,都把他转化为不含什么的,这样就跟不要62这道题一模一样了
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<map> #include<string> #include<vector> using namespace std; typedef long long ll; const int N=2e5+5; ll f[21][10]; void init(){ int i; int j,k; for(i=0;i<=9;i++){ f[1][i]=1; } for(i=2;i<20;i++){ for(j=0;j<=9;j++){ for(k=0;k<=9;k++){ if(j==4&&k==9) continue; f[i][j]+=f[i-1][k]; } } } } ll dp(ll n){ if(!n) return 0; vector<int> num; while(n){ num.push_back(n%10); n/=10; } int i,j; ll res=0; ll last=0; for(i=num.size()-1;i>=0;i--){ int x=num[i]; for(j=0;j<x;j++){ if(last==4&&j==9) continue; res+=f[i+1][j]; } if(x==9&&last==4) break; last=x; if(!i) res++; } return res; } int main(){ int i; int t; cin>>t; init(); while(t--){ ll r; cin>>r; cout<<r-dp(r)+1<<endl; } }