题目描述

在中国,很多人都把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 10

输出样例#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[3001],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*10+6);
23     dfs_pre(s*10+8);
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==0)
33     {
34         ans+=f*(r/s-(l-1)/s);
35         return;
36     }
37      lol g=gcd(s,luck[x]);
38      if ((double)s/(double)g<=(double)r/(double)luck[x]) dfs(x-1,s/g*luck[x],f*(-1));
39      dfs(x-1,s,f);
40 }
41 int main()
42 {int i,j;
43     cin>>l>>r;
44      dfs_pre(0);
45      for (i=1;i<=cnt;i++)
46      {
47          for (j=1;j<i;j++)
48           if (luck[j]!=-1&&luck[i]%luck[j]==0)
49             luck[i]=-1;
50      }
51       sort(luck+1,luck+cnt+1,cmp);
52       for (i=cnt;i>=1;i--)
53       if (luck[i]==-1) cnt--;
54       sort(luck+1,luck+cnt+1);
55     dfs(cnt,1,-1);
56     cout<<r-l+1+ans;
57 }

转载于:https://www.cnblogs.com/Y-E-T-I/p/7275512.html

[SCOI2010]幸运数字相关推荐

  1. P2567 [SCOI2010]幸运数字

    P2567 [SCOI2010]幸运数字 题意: 我们规定只含6或8的数字为幸运号码,而幸运号码的倍数我们也认为是幸运号码,问[l,r]中有多少个幸运号码? 题解: 第一反应是数位dp,但其实不是,我 ...

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

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

  3. [luogu2576 SCOI2010] 幸运数字 (容斥原理)

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

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

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

  5. bzoj1853 [Scoi2010]幸运数字

    http://www.elijahqi.win/archives/3883 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码 ...

  6. BZOJ1853: [Scoi2010]幸运数字(容斥原理)

    题意 询问区间$(l, r)$中有多少个数是只含$6, 8$的数的倍数 Sol 思路很妙啊. 首先在$10^{10}$内只含$6, 8$的数有$\sum_{i = 1}^{10} 2^i = 2046 ...

  7. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

    容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...

  8. 【BZOJ-18532393】幸运数字Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 1817  Solved: 665 [Submit][Statu ...

  9. [BZOJ1853][SCOI2010][容斥原理]幸运数字

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

最新文章

  1. SQLAlchemy 常用基本表
  2. 笔记本连接显示器后没有声音_电脑用HDMI外界显示器后,没有声音
  3. WebDriver API
  4. 2021牛客暑期多校训练营8,签到题ADEK
  5. 大白话理解可达性分析算法
  6. python爬虫,用scrapy爬取天天基金
  7. A链接标签点击不会触发任何行为的写法
  8. 领先农业技术平台Dimitra,帮助小农户实现农业现代化
  9. 电视机未来会成为家庭交互中心?
  10. win10计算机右键属性打不开,win10电脑系统属性打不开的解决方法
  11. 一款炫酷牛逼叼炸天的接口测试神器:【postwoman】(postman女票) 【Apifox】
  12. gif动图制作方法一
  13. 涠洲岛日出日落时间表,1月10日涠洲岛开船时间/日出日落/天气预报
  14. 上顿号符号_在电脑上打标点符号,顿号怎样打出来?
  15. ubuntu apt安装java_Ubuntu 16.04 apt方式安装JDK并且配置Java开发环境详解
  16. 无线路由实战(一):增强无线wifi信号和加速wifi的十一种方法
  17. 当STM32遇上RFID
  18. pytest单元测试框架
  19. 408 数据结构 知识点总结
  20. PickerView(二级联动)

热门文章

  1. c语言struct要点
  2. 宏信建发上市破发:募资15亿港元跌29% 公司市值103亿港元
  3. python网站设计开题报告_网页设计开题报告范文
  4. 内网与外网文件传输工具
  5. 23种设计模式学习文档
  6. python opencv通过4个坐标,剪裁图片(抠图)
  7. ssm校内超市管理系统 本系统分为管理员与普通用户两种角色
  8. 注意:lammps最新版本更换运行命令
  9. Button的onClick属性
  10. 素数环java_素数环问题