首页 > 代码库 > 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 }
hdu 2089 不要62
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。