Bomb(hdu 3555)

题意:给定一个闭区间,求区间内有多少数中含“49”

/*
  dp[i][j]表示i位数以j为最高位位中的所有不符合数的个数。
  然后把数字拆分,乱搞即可。
*/
#include<cstdio>
#include<iostream>
#define lon long long
using namespace std;
lon dp[25][12];
void init(){
    dp[0][0]=1;
    for(int i=1;i<=20;i++)
        for(int j=0;j<=9;j++)
            for(int k=0;k<=9;k++)
                if(!(j==4&&k==9))
                    dp[i][j]+=dp[i-1][k];
}
lon solve(lon n){
    int a[25],len=0;
    while(n){
        a[++len]=n%10;
        n/=10;
    }
    a[len+1]=0;
    lon ans=0;
    for(int i=len;i;i--){
        for(int j=0;j<a[i];j++)
            if(!(a[i+1]==4&&j==9))
                ans+=dp[i][j];
        //当高位出现49时,低位就不用再计算了
        if(a[i]==9&&a[i+1]==4) break;
    }
    return ans;
}
int main(){
    init();
    int T;scanf("%d",&T);
    while(T--){
        lon x;
        scanf("%I64d",&x);
        printf("%I64d\n",x+1-solve(x+1));
    }
    return 0;
}

 

posted @ 2017-01-15 22:08  karles~  阅读(175)  评论(0编辑  收藏  举报