Http://www.cnblogs.com/xiaohongmao/p/3473599.html
#include <cstdio>using namespace Std;int n,m,f[8][3];void init () {f[0][0]=1; for (int i=1;i<=7;++i) {f[i][0]=f[i-1][0]*9-f[i-1][1]; F[I][1]=F[I-1][0]; F[I][2]=F[I-1][2]*10+F[I-1][0]+F[I-1][1]; }}int work (int x) {int ans=0,t=x,bit[10],len=0; while (t) {bit[++len]=t%10; t/=10; } bit[len+1]=bit[len+2]=0; BOOL flag=0; for (int i=len;i;--i) {if ((bit[i+1]==2 && bit[i+2]==6) | | bit[i+1]==4) flag=1; Ans+=f[i-1][2]*bit[i]; if (flag) ans+=bit[i]*f[i-1][0]; else {if (Bit[i] > 6) ans+=f[i-1][1]; if (Bit[i] > 4) ans+=f[i-1][0]; if (bit[i+1] = = 6 && bit[i] > 2) ans+=f[i][1]; }} return X-ans;} int main () {init ();//Freopen ("Hdu2089.in", "R", stdin); while (1) {scanf ("%d%d", &n,&m); if ((!n) && (!m)) break; printf ("%d\n", Work (m+1)-work (n)); } return 0;}
"Digital DP" bzoj2089 not to be counted