题意:给定一个闭区间,求区间内有多少数中含“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 ",x+1-solve(x+1)); } return 0; }