src : http://acm.hdu.edu.cn/showproblem.php?pid=2089
前导零:前导零 是一种 显示数字前面的0的一种格式,比如:000,222.340这样 的好处是 格式对齐..比如我们要求是3位数的 数字001002003..010011.这样有前导零 会更好记录和排序
ac代码:
#include<bits/stdc++.h> using namespace std; #define per(i,a,b) for(int i=a;i <= b;i++) #define max(a,b) a=max(a,b) #define min(a,b) a=min(a,b) #define sz(x) (int)x.size() typedef long long ll; ll gcd(ll a,ll b){while(b){ll t=b;b=a%b;a=t;}return a;} const int inf=0x3f3f3f3f; const int mod=1000000007; #define siz 40005 int n,m,a[10],dp[10][2];//dp[pos][sta]表示前一位sta状态下这一位及之后的数位构成的所有可能 ll dfs(int pos,int pre,int sta,bool limit)//这里sta的值是0/1,用来区分pre是不是6 {//limit用来判断前一位是不是数位上界,是则本位不能取到大于a[pos]的数 if(pos==-1)return 1; if(!limit&&dp[pos][sta]!=-1)return dp[pos][sta]; int up=limit?a[pos]:9; ll ans=0; for(int i=0;i<=up;i++){ if(i==4||(pre==6&&i==2))continue; ans+=dfs(pos-1,i,i==6,limit&&i==a[pos]); } if(!limit)dp[pos][sta]=ans; return ans; } ll solve(int u) { int cnt=0; while(u){ a[cnt++]=u%10; u/=10; } return dfs(cnt-1,-1,false,true); } int main() { memset(dp,-1,sizeof(dp)); while(scanf("%d %d",&n,&m)!=EOF&&(n||m)){ printf("%lld ",solve(m)-solve(n-1)); } return 0; }