求1~N中有多少个数包含“49”字样,N<2^63-1
#include <iostream>
using namespace std;
typedef unsigned long long u64;
u64 f[30];
u64 g[30];
u64 h[30];
void solve(){
u64 n;
cin>>n;
n++;
int a[30]={0};
int len=0;
while(n){
a[++len]=n%10;
n/=10;
}
u64 ans=0;
int flag=0;
for(int i=len;i>0;--i){
ans+=a[i]*f[i-1];
if(flag){
ans+=a[i]*g[i-1];
}else{
if(a[i]>4){
ans+=h[i-1];
}
}
if(a[i+1]==4 && a[i]==9){
flag=1;
}
}
cout<<ans<<endl;
}
int main(){
f[0]=0;
g[0]=1;
h[0]=0;
for(int i=1;i<=20;++i){
f[i]=f[i-1]*10+h[i-1];
g[i]=g[i-1]*10-h[i-1];
h[i]=g[i-1];
}
int t;cin>>t;
while(t--){
solve();
}
return 0;
}