您的位置:首页 > 其它

【数位DP】【HDU 3555】Bomb

2014-01-08 19:43 441 查看
求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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp