欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1853


题意概括

  求一个区间范围内,近似幸运数字的个数。

  定义:

  幸运数字:仅由6或者8组成的数字。

  近似幸运数字:幸运数字的正整数倍。


题解

  我们发现幸运数字很少。

  然后,我们考虑容斥。

  我们发现原来的大整数除几次机会很小。所以记忆化dfs容斥,中途跳出。

  这样可以节省很多时间。

  然后居然过去了。


代码

  1. #include <cstring>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. typedef unsigned long long LL;
  8. int totluck;
  9. LL L,R,ans,luck[2050];
  10. bool alive[2050];
  11. void df(LL x){
  12. if (x>R)
  13. return;
  14. if (x>0)
  15. luck[++totluck]=x;
  16. df(x*10+6);
  17. df(x*10+8);
  18. }
  19. LL gcd(LL a,LL b){
  20. return b?gcd(b,a%b):a;
  21. }
  22. void dfs(int num,int pos,LL Lcm){
  23. if (pos>totluck){
  24. if (num==0)
  25. return;
  26. if (num%2==1)
  27. ans+=R/Lcm-(L-1)/Lcm;
  28. else
  29. ans-=R/Lcm-(L-1)/Lcm;
  30. return;
  31. }
  32. dfs(num,pos+1,Lcm);
  33. LL g=Lcm/gcd(Lcm,luck[pos]);
  34. if (1.0*g*luck[pos]<=R)
  35. dfs(num+1,pos+1,g*luck[pos]);
  36. }
  37. bool cmp(LL a,LL b){
  38. return a>b;
  39. }
  40. int main(){
  41. scanf("%llu%llu",&L,&R);
  42. totluck=0;
  43. df(0);
  44. sort(luck+1,luck+totluck+1,cmp);
  45. memset(alive,true,sizeof alive);
  46. for (int i=1;i<totluck;i++)
  47. for (int j=i+1;j<=totluck&&alive[i];j++)
  48. if (luck[i]%luck[j]==0)
  49. alive[i]=0;
  50. int to=0;
  51. for (int i=1;i<=totluck;i++)
  52. if (alive[i])
  53. luck[++to]=luck[i];
  54. totluck=to;
  55. ans=0;
  56. dfs(0,1,1);
  57. printf("%llu\n",ans);
  58. return 0;
  59. }

  

BZOJ1853 [Scoi2010]幸运数字 容斥原理的更多相关文章

  1. BZOJ1853 Scoi2010 幸运数字 【枚举+容斥】

    BZOJ1853 Scoi2010 幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号 ...

  2. Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1774  Solved: 644[Submit][Status] ...

  3. bzoj1853[Scoi2010]幸运数字 容斥

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3027  Solved: 1128[Submit][Status ...

  4. 1853: [Scoi2010]幸运数字[容斥原理]

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status] ...

  5. [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3202  Solved: 1198[Submit][Status ...

  6. 【BZOJ1853】[Scoi2010]幸运数字 容斥原理+搜索

    Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,88 ...

  7. bzoj1853: [Scoi2010]幸运数字 dp+容斥原理

    在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是 ...

  8. BZOJ1853 [Scoi2010]幸运数字

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  9. 2019.01.17 bzoj1853: [Scoi2010]幸运数字(容斥+dfs)

    传送门 搜索菜题,然而第一次没有注意然后爆longlonglong longlonglong了. 题意:称所有数位由6,86,86,8组成的数为幸运数字,问一个一个区间[l,r][l,r][l,r]中 ...

随机推荐

  1. ROS安装与卸载

    1 版本选择 ROS 虽说也叫操作系统,但它是寄生在 LINUX 操作系统之下的,所以要求大兄弟你的电脑里至少要先有一个 LINUX 操作系统. 而对 ROS 兼容性最好的当属 Ubuntu 操作系统 ...

  2. CC254x/CC2540/CC2541库函数速查(转)

    hci.h 转自:http://blog.csdn.net/xiaoleiacmer/article/details/44036607#t1 //分配内存,应用程序不应该调用这个函数. void *H ...

  3. find结合rm删除或mv移动文件的方法

    删除过期的备份文件,多用find结合rm方法,可以使用-exec或xargs -exec rm -rf {} \; 或 find /home/mysqlbackup -name "*$thi ...

  4. centos6.5环境基于conga的web图形化界面方式配置rhcs集群

    一.简介 RHCS 即 RedHat Cluster Suite ,中文意思即红帽集群套件.红帽集群套件(RedHat Cluter Suite, RHCS)是一套综合的软件组件,可以通过在部署时采用 ...

  5. 自定义el标签

    编写java代码 package com.ycjk.common; public class FormatJSEltarg { public static String format(String s ...

  6. 强大的Js树型控件Dtree使用详解

    http://www.lmwlove.com/ac/ID868 在学习文章之前,要学会看官方网站http://destroydrop.com/javascripts/tree.从官方页面你能知道:dt ...

  7. VMware环境和Window环境进行网络连接的问题

    一. 首先贴出本人在网络上找到与VMware网络连接相关的知识点 安装完虚拟机后,默认安装了两个虚拟网卡,VMnet1和VMnet8,其他的未安装(当然也可以手动安装其他的).其中VMnet1是hos ...

  8. Android:注册登录

    注册登录的实现 先在layout里新建一个xml文件: //login.xml <?xml version="1.0" encoding="utf-8"? ...

  9. JS/Jquery版本的俄罗斯方块(附源码分析)

    转载于http://blog.csdn.net/unionline/article/details/63250597 且后续更新于此 1.前言 写这个jQuery版本的小游戏的缘由在于我想通过从零到有 ...

  10. [学习笔记]Java代码中各种类型变量的内存分配机制

    程序运行时,我们最好对数据保存到什么地方做到心中有数.特别要注意的是内存的分配.有六个地方都可以保存数据: (1) 寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而 ...