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 ",work(m+1)-work(n)); } return 0; }