题意:给定一个闭区间,求区间内有多少数中含“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; }