題意:給定一個閉區間,求區間內有多少數中含“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; }
?