题目描述

在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”。lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”。

现在lxhgww想知道在一段闭区间[a, b]内,“近似幸运号码”的个数。

输入输出格式

输入格式:

输入数据是一行,包括2个数字a和b

输出格式:

输出数据是一行,包括1个数字,表示在闭区间[a, b]内“近似幸运号码”的个数

输入输出样例

输入样例#1:

  1. 1 10
输出样例#1:

  1. 2

说明

对于30%的数据,保证1<=a<=b<=1000000

对于100%的数据,保证1<=a<=b<=10000000000

题解:

容斥原理+dfs

存在左界不难,只要容斥时减去左边的伪幸运数,假设要求[a,b],其中一个因数为p1

只要由b/p1->b/p1-(a-1)/p1

首先dfs求出所有幸运数字,

总方案ans=(b/p1-(a-1)/p)+(b/p2-(a-1)/p)+...-(b/p1p2-(a-1)/p1p2)-......

不过直接dfs显然超时

优化:

1.减小搜索范围,根据容斥原理,可以知道当px|py时,py与px显然重合且py无用,直接去掉,形成新的幸运数组

2.时刻判断lcm(s,x)是否超过r,超过则不选该数x,记住判断时由于数太大,可能会溢出,所以要把判断换一下

 s*x/gcd(s,x)<=r ->s/gcd(s,x)<=(double)r/x这里的double是为防止整形判断有误(应该不会错,但会慢一点)

3.完成以上2步应该是60分,还有关键一点:调整搜索顺序

显然先从大的幸运数开始容斥,会在开始时产生较少的分支,而搜索算法的搜索树靠近根的分支越少就越快

所以将幸运数重新排序就可以AC了,比原来快的多

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. typedef long long lol;
  8. lol luck[],l,r,ans;
  9. int cnt;
  10. bool cmp(lol a,lol b)
  11. {
  12. return a>b;
  13. }
  14. void dfs_pre(lol s)
  15. {
  16. if (s>r) return;
  17. if (s)
  18. {
  19. cnt++;
  20. luck[cnt]=s;
  21. }
  22. dfs_pre(s*+);
  23. dfs_pre(s*+);
  24. }
  25. lol gcd(lol a,lol b)
  26. {
  27. if (!b) return a;
  28. return gcd(b,a%b);
  29. }
  30. void dfs(int x,lol s,int f)
  31. {
  32. if (x==)
  33. {
  34. ans+=f*(r/s-(l-)/s);
  35. return;
  36. }
  37. lol g=gcd(s,luck[x]);
  38. if ((double)s/(double)g<=(double)r/(double)luck[x]) dfs(x-,s/g*luck[x],f*(-));
  39. dfs(x-,s,f);
  40. }
  41. int main()
  42. {int i,j;
  43. cin>>l>>r;
  44. dfs_pre();
  45. for (i=;i<=cnt;i++)
  46. {
  47. for (j=;j<i;j++)
  48. if (luck[j]!=-&&luck[i]%luck[j]==)
  49. luck[i]=-;
  50. }
  51. sort(luck+,luck+cnt+,cmp);
  52. for (i=cnt;i>=;i--)
  53. if (luck[i]==-) cnt--;
  54. sort(luck+,luck+cnt+);
  55. dfs(cnt,,-);
  56. cout<<r-l++ans;
  57. }

[SCOI2010]幸运数字的更多相关文章

  1. BZOJ 1853: [Scoi2010]幸运数字

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

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

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

  3. bzoj 1853: [Scoi2010]幸运数字 容斥

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

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

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

  5. BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理

    BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理 题意: ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种 ...

  6. 【BZOJ 1853】 1853: [Scoi2010]幸运数字 (容斥原理)

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2472  Solved: 911 Description 在中国 ...

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

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

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

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

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

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

  10. 【bzoj1853】: [Scoi2010]幸运数字 数论-容斥原理

    [bzoj1853]: [Scoi2010]幸运数字 预处理出所有幸运数字然后容斥原理 但是幸运数字是2logn个数的 直接搞会炸 所以把成倍数的处理掉 然后发现还是会T 所以数字要从大到小处理会快很 ...

随机推荐

  1. Beta敏捷冲刺每日报告——Day2

    1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.2 00:00 -- 2017.11.3 00:00 讨论时间地点 2017.11.2 晚9:30,电话会议会议 ...

  2. 标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

    标准C++类std::string的内存共享,值得体会: 详见大牛:https://www.douban.com/group/topic/19621165/ 顾名思义,内存共享,就是两个乃至更多的对象 ...

  3. 【详细】Lucene使用案例

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引 ...

  4. httpClient 中的post或者get请求

    httpClient相对于java自带的请求功能更加强大,下面就以例子的形式给出: //HttpClient Get请求 private static void register() { try { ...

  5. linux系统增加开机启动服务/应用

    操作 在/etc/init.d下新建示例脚本文件(customize.sh),该脚本会启动zookeeper服务.内容如下: #!/bin/sh /usr/local/zookeeper-/bin/z ...

  6. 裸辞两个月,海投一个月,从Android转战Web前端的求职之路

    前言 看到这个标题的童鞋,可能会产生两种想法: 想法一:这篇文章是标题党 想法二:Android开发越来越不景气了吗?前端越来越火了吗? 我一向不喜欢标题党,标题中的内容是我的亲身经历.我是2016年 ...

  7. Struts2 配置文件小结

    每次写的博文都被管理员都被移出首页,好气!还希望有哪位大神可以指点迷津-- struts2 配置文件的 result 节点 result 节点是 action 节点的子节点,他代表着 action 方 ...

  8. 新概念英语(1-13)A new dress

    What colour is Anna's hat? A:What colour is your new dress? B:It's green.Come upstairs and see it. A ...

  9. mysql Access denied for user root@localhost错误解决方法

    select * from user \G use mysql select * from user limit 1 \G update user set Host='%' where `User`= ...

  10. PHP环境配置(1)

    Apache下载 Apache下载地址:http://httpd.apache.org/download.cgi 第一步:点击Files for Microsoft Windows 第二步:点击Apa ...