HDU2089:不要62
数位dp。。。要求不含62和4。dp[i][0]表示不含,dp[i][1]表示i位为6,dp[i][2]表示含。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) int read(){ int x=0;char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x; } int dp[10][3],bit[10]; void init(){ clr(dp,0);dp[0][0]=1; rep(i,1,9){ dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; dp[i][1]=dp[i-1][0]; dp[i][2]=dp[i-1][1]+dp[i-1][0]+dp[i-1][2]*10; } } int work(int x){ int ans=0,tmp=x,cnt=0; while(tmp){ bit[++cnt]=tmp%10;tmp/=10; } bit[cnt+1]=0;bool flag=false; dwn(i,cnt,1){ ans+=bit[i]*dp[i-1][2]; if(flag) ans+=bit[i]*dp[i-1][0]; else{ if(bit[i]>4) ans+=dp[i-1][0]; if(bit[i]>6) ans+=dp[i-1][1]; if(bit[i+1]==6&&bit[i]>2) ans+=dp[i][1]; } if(bit[i]==4||bit[i+1]==6&&bit[i]==2) flag=true; } return x-ans; } int main(){ init(); while(1){ int n=read(),m=read(); if(n+m==0) break; printf("%d\n",work(m+1)-work(n)); } return 0; }