bzoj1853幸运数字
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1853
容斥原理的应用。
发现十位的话只有2047个只含6或8的数,故可以存。它们的倍数个数只要到时候用边界除以一下就行了。
但容斥原理是指数级别的。故剪枝:
因为比 r 大的 lcm 就没用了。故若当前的累计lcm已经大于r,因为越乘越大,故直接剪掉。
怎样考虑顺序才能使剪枝更有效呢?
在每一层都有两种情况:选当前元素和不选当前元素。一直递归到序号大于n时更新答案并return;
也就是排在前面的元素改一下,就把它后面的元素的种种状况都考虑完,之后再改一下这个前面的元素,再……
若从小到大排序,则经过种种状态到达很后面一个位置时突然发现超过了r,于是回溯;这样会把“前面的种种状态”都遍历一遍,每次到了这儿回溯;
但若从大到小排序,则原来的“前面的种种状态”变成了“后面的种种状态”,一旦在此return,就不会遍历后面了,剪枝变得更有效了。
也就是值越大,越容易使累计的lcm越过r,所以把值大的放在前面,就可以使剪枝更有效。
似乎因为很容易就越过r了,所以加了剪枝就可以轻松过了。
小注意:lcm算出来的话似乎会爆long long,但可以用long long记在参数里。所以是先求一个tmp,再用double比较。(虽然double精度有点低)。
但有一个很好的方法!就是不比较 a[k] * tmp <=r,而是比较 tmp <= r / a[k] !这样就肯定不会爆了~
但:本代码中所有都是 l l。另有把计数的k,cnt之类写成int的(只有这一点区别),就RE了。真是不明所以。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll l,r,a[],b[],m,n,ans;
bool er[];
void pre(ll k)
{
if(k>r)return;
a[++m]=k;
pre(k*+);
pre(k*+);
}
ll gcd(ll u,ll v)
{
return v==?u:gcd(v,u%v);
}
void dfs(ll k,ll cnt,ll z)//第k号 选了cnt个元素 之前的lcm为z
{
if(k>n)
{
if(!cnt)return; //////
if(cnt&)ans+=r/z-(l-)/z;
else ans-=r/z-(l-)/z;
return;
}
dfs(k+,cnt,z);
ll tmp=z/gcd(a[k],z);
if((double)a[k]*tmp<=r)dfs(k+,cnt+,a[k]*tmp);
}
int main()
{
scanf("%lld%lld",&l,&r);
pre();pre();
sort(a+,a+m+);
for(ll i=;i<=m;i++)
if(!er[i])
{
for(ll j=i+;j<=m;j++)
if(a[j]%a[i]==)er[j]=;
b[++n]=a[i];
}
for(ll i=;i<=n;i++)
a[i]=b[n-i+];
dfs(,,); ///z=1
printf("%lld",ans);
return ;
}
bzoj1853幸运数字的更多相关文章
- [bzoj1853]幸运数字
容易发现幸运数字只有1024个,暴力标记倍数还是会tle的 容斥,即从中任选i个的lcm,复杂度为$o(2^1024)$ 剪枝一:当答案超过1024就不用算了 剪枝二:当某个数是另一个数的倍数时就删掉 ...
- bzoj1853幸运数字——容斥原理
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1853 dfs实现容斥原理即可. 注意:若在init中写“cnt++”,则出来后需要先cnt-- ...
- 【BZOJ-1853&2393】幸运数字&Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1817 Solved: 665[Submit][Status] ...
- 【bzoj1853】 Scoi2010—幸运数字
http://www.lydsy.com/JudgeOnline/problem.php?id=1853 (题目链接) 今天考试考了容斥,结果空知道结论却不会写→_→ 题意 求区间中不含6,8两个数字 ...
- BZOJ1853 [Scoi2010]幸运数字 容斥原理
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1853 题意概括 求一个区间范围内,近似幸运数字的个数. 定义: 幸运数字:仅由6或者8组成的数字. ...
- 【BZOJ1853】幸运数字(搜索,容斥)
[BZOJ1853]幸运数字(搜索,容斥) 题面 BZOJ 洛谷 题解 成功轰下洛谷rk1,甚至超越了一个打表选手 这题思路很明显吧,先搞出来所有范围内的合法数字,然后直接容斥, 容斥的话显然没有别的 ...
- BZOJ1853 Scoi2010 幸运数字 【枚举+容斥】
BZOJ1853 Scoi2010 幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号 ...
- 【bzoj1853】: [Scoi2010]幸运数字 数论-容斥原理
[bzoj1853]: [Scoi2010]幸运数字 预处理出所有幸运数字然后容斥原理 但是幸运数字是2logn个数的 直接搞会炸 所以把成倍数的处理掉 然后发现还是会T 所以数字要从大到小处理会快很 ...
- 【BZOJ1853/2393】[Scoi2010]幸运数字/Cirno的完美算数教室 DFS+容斥
[BZOJ1853][Scoi2010]幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那 ...
随机推荐
- Eclipse重命名项目名后如何彻底修改工程名
背景:在Eclipse中当我们修改了一个Web项目名称后,在再次运行该项目,发现使用新的名称无法正常的浏览,而用旧的名称去可以 解决方案: 1:修改该项目目录下:.project文件 <?xml ...
- 【webpack系列】1 What is webpack?
什么是webpack? 现今的网页可以看做是功能丰富的应用,拥有着复杂的js代码和一大堆依赖包.为了简化开发的复杂程度,有了很多好用的实践方法 模块化 让我们可以把复杂的程序细化为小的文件 类似于Ty ...
- JavaScript学习总结(十八)——JavaScript获取浏览器类型与版本
从网上找到一段使用JavaScript判断浏览器以及浏览器版本的比较好的代码,在此记录一下: 1 <script type="text/javascript"> 2 v ...
- React教程-初入
学习了React很久,一直没有机会总结下,最近打算写一个简单的React,希望让初学者一看就懂,不走弯路,我尽量写的简明点好了开始吧!首页我们要利用npm安装 react(当然你也可以用引用方式)跟着 ...
- openSUSE 12.3 默认启动项
修改默认opensuse12.3的默认启动项目(grub2). vim /boot/grub2/grubenv 里面有一条: saved_entry=openSUSE 12.3 修改为saved_en ...
- python3 win10_x64 安装pcapy
稀里糊涂就装上了 大概记录一下都有什么. visual studio build tools 2015 下载地址: http://landinghub.visualstudio.com/visual- ...
- Flask初级(九)flash与前台交互get详解
Project name :Flask_Plan templates:templates static:static @app.route('/') def hello_world(): return ...
- git操作远端分支(转)
http://www.cnblogs.com/Camier-myNiuer/p/5558884.html 原文地址:http://hi.baidu.com/lingzhixu/blog/item/4a ...
- 配置javaBean
bean基本配置: <bean id="exampleBean" class="examples.ExampleBean"></bean> ...
- Android RIL结构分析与移植
介绍 本文档对Android RIL部分的内容进行了介绍,其重点放在了Android RIL的原生代码部分. 包括四个主题: 1.Android RIL框架介绍 2.Android RIL与 Wind ...