首页 > 代码库 > hdu 2089 不要62

hdu 2089 不要62

http://acm.hdu.edu.cn/showproblem.php?pid=2089

和hdu 3555 一样,先预处理,从最高位处理。然后减去不符合要求的,就是所求的。

 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define ll int 5 using namespace std; 6  7 ll dp[30][3]; 8 int num[30]; 9 10 void inti()11 {12     memset(dp,0,sizeof(dp));13     dp[0][0]=1;14     dp[0][1]=0;15     dp[0][2]=0;16     for(int i=1; i<30; i++)17     {18         dp[i][0]=dp[i-1][0]*9-dp[i-1][1];19         dp[i][1]=dp[i-1][0];20         dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0];21     }22 }23 24 25 ll get(int n)26 {27     int cnt=0;28     while(n)29     {30         num[++cnt]=n%10;31         n=n/10;32     }33     num[cnt+1]=0;34     bool flag=false;35     ll ans=0;36     for(int i=cnt; i>=1; i--)37     {38         ans+=dp[i-1][2]*num[i];39         if(flag) ans+=dp[i-1][0]*num[i];40         if(!flag&&num[i]>4)41         {42             ans+=dp[i-1][0];43         }44         if(!flag&&num[i]>6)45         {46             ans+=dp[i-1][1];47         }48         if(!flag&&num[i+1]==6&&num[i]>2)49         {50             ans+=dp[i][1];51         }52         if(num[i]==4||(num[i+1]==6&&num[i]==2))53         {54             flag=true;55         }56     }57     if(flag) ans++;58     return ans;59 }60 int main()61 {62     inti();63     ll n,m;64     while(scanf("%d%d",&n,&m)!=EOF)65     {66         if(n==0&&m==0) break;67         ll ans=get(m)-get(n-1);68         printf("%d\n",m-n+1-ans);69     }70     return 0;71 }
View Code

 

hdu 2089 不要62