原来数位DP没我想的那么难啦啦♪(∇*)
感觉数位DP都还挺套路的
#include<bits/stdc++.h> using namespace std; const int N=100001; int n,m; int L,a[10]; int f[10][10][2]; void read(int &x){ char ch=getchar();x=0; for(;ch<'0'||ch>'9';ch=getchar()); for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0'; } int solve(int n){ for(L=0;n;n/=10) a[++L]=n%10; for(int i=1;i<=L/2;i++) swap(a[i],a[L+1-i]); memset(f,0,sizeof f); f[0][0][1]=1; for(int i=0;i<L;i++) for(int j=0;j<=9;j++) for(int k=0;k<2;k++) if (f[i][j][k]){ for(int l=0;l<a[i+1];l++) if (j==6&&l==2 || l==4) 233; else f[i+1][l][0]+=f[i][j][k]; if (j==6&&a[i+1]==2 || a[i+1]==4) 233; else f[i+1][a[i+1]][k]+=f[i][j][k]; if (k==0){ for(int l=a[i+1]+1;l<=9;l++) if (j==6&&l==2 || l==4) 233; else f[i+1][l][0]+=f[i][j][k]; } } int ans=0; for(int i=0;i<=9;i++) ans+=f[L][i][0]+f[L][i][1]; return ans; } int main(){ for(;;){ read(n);read(m); if (n==0&&m==0) break; printf("%d\n",solve(m)-solve(n-1)); } return 0; }