【BZOJ1853】幸运数字(搜索,容斥)
【BZOJ1853】幸运数字(搜索,容斥)
题面
题解
成功轰下洛谷rk1,甚至超越了一个打表选手
这题思路很明显吧,先搞出来所有范围内的合法数字,然后直接容斥,
容斥的话显然没有别的办法解决,只能够爆搜,
那么我们就来大力剪枝:
1.如果当前的所有选定的数的\(lcm\)大于\(r\)直接退出,这不显然吗。。
2.如果一个合法数字是另外一个合法数字的倍数,那么这个数没有意义,这不还是显然吗。
3.把合法的所有数字从大往小排序,这样爆搜的时候更快突破边界。
好了,这样子就可以在洛谷上\(AC\)了,然而\(BZOJ\)总时限并过不去。
接着剪枝,现在因为所有数都不满足是另外一个数的倍数,
所以合并任意两个数的时候,\(lcm\)的最小情况就是乘上一个\(3\)
所以对于所有\(>r/3\)的合法数字,显然不能够和任何一个数合并了,
所以这一部分可以拿出来直接提前算好,再用剩下的数字爆搜就好啦。
跑得飞快的。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
int tot;
ll a[5050],ret,l,r;
void dfs(ll x){if(x>r)return;if(x)a[++tot]=x;dfs(x*10+6);dfs(x*10+8);}
const int MOD=1000000007;
bool check(ll a,ll b)
{
int A=a/MOD,B=b/MOD;
if(A*B)return true;
return a*b>r;
}
void calc(int x,ll s,int cnt)
{
if(x>tot&&s!=1)
{
if(cnt&1)ret+=r/s-l/s;
else ret-=r/s-l/s;
return;
}
if(x>tot)return;
calc(x+1,s,cnt);
ll d=a[x]/__gcd(s,a[x]);
if(!check(s,d))calc(x+1,s*d,cnt+1);
}
bool vis[5050];
ll Work()
{
dfs(0);sort(&a[1],&a[tot+1]);
int t=0;
for(int i=1;i<=tot;++i)
for(int j=1;j<i;++j)
if(a[i]%a[j]==0){vis[i]=true;break;}
for(int i=1;i<=tot;++i)
if(!vis[i])
{
if(a[i]<=r/3)a[++t]=a[i];
else ret+=r/a[i]-l/a[i];
}
tot=t;reverse(&a[1],&a[tot+1]);calc(1,1,0);
return ret;
}
int main()
{
cin>>l>>r;--l;
cout<<Work()<<endl;
return 0;
}
【BZOJ1853】幸运数字(搜索,容斥)的更多相关文章
- 2019.01.17 bzoj1853: [Scoi2010]幸运数字(容斥+dfs)
传送门 搜索菜题,然而第一次没有注意然后爆longlonglong longlonglong了. 题意:称所有数位由6,86,86,8组成的数为幸运数字,问一个一个区间[l,r][l,r][l,r]中 ...
- [SCOI2010]幸运数字(容斥+爆搜)
在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是 ...
- 【Luogu】P2567幸运数字(容斥爆搜)
题目链接 先预处理出幸运数,把成倍数关系的剔掉,然后用容斥原理搜索一下. 这里的容斥很像小学学的那个“班上有n个同学,有a个同学喜欢数学,b个同学喜欢语文……”那样. #include<cstd ...
- P2567 [SCOI2010]幸运数字 DFS+容斥定理
P2567 [SCOI2010]幸运数字 题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,66 ...
- BZOJ2393 & 1853 [Scoi2010]幸运数字 【搜索 + 容斥】
题目 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是" ...
- [bzoj1853]幸运数字
容易发现幸运数字只有1024个,暴力标记倍数还是会tle的 容斥,即从中任选i个的lcm,复杂度为$o(2^1024)$ 剪枝一:当答案超过1024就不用算了 剪枝二:当某个数是另一个数的倍数时就删掉 ...
- bzoj1853幸运数字
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1853 容斥原理的应用. 发现十位的话只有2047个只含6或8的数,故可以存.它们的倍数个数只要 ...
- bzoj1853幸运数字——容斥原理
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1853 dfs实现容斥原理即可. 注意:若在init中写“cnt++”,则出来后需要先cnt-- ...
- P2567 [SCOI2010]幸运数字
题目 P2567 [SCOI2010]幸运数字 做法 容斥+剪枝 先预处理幸运数字,别看数据范围这么大,其实也没几个,然后去掉倍数这种 然后处理相似数字,一眼的容斥,递归选数然后求出这些的公倍数容斥一 ...
- BZOJ1853 [Scoi2010]幸运数字
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
随机推荐
- IEEE1588 ( PTP ) 协议简介
IEEE1588 协议,又称 PTP( precise time protocol,精确时间协议),可以达到亚微秒级别时间同步精度,于 2002 年发布 version 1,2008 年发布 vers ...
- Netty源码分析第5章(ByteBuf)---->第1节: AbstractByteBuf
Netty源码分析第五章: ByteBuf 概述: 熟悉Nio的小伙伴应该对jdk底层byteBuffer不会陌生, 也就是字节缓冲区, 主要用于对网络底层io进行读写, 当channel中有数据时, ...
- ansible软件2
常用软件安装及使用目录 ansible使用1 第1章 copy模块 1.1 创建文件及写入内容 1. [root@m01 scripts]# ansible oldboy -m copy -a &q ...
- 【Py大法系列--01】20多行代码生成你的微信聊天机器人
前言 近期Stack Overflow公布了一项调查显示,Python已经成了发展最快的主流编程语言,Python搭乘着数据科学和机器学习以及人工智能的浪潮,席卷了整个技术圈.越来越多的人想了解.想学 ...
- Redux和React-Redux的实现(二):Provider组件和connect的实现
接着上一篇讲,上一篇我们实现了自己的Redux和介绍了React的context以及Provider的原理. 1. Provider组件的实现 Provider组件主要有以下下两个作用 在整个应用上包 ...
- Task 6.2站立会议二
今天,我们开始自己开始编译运行代码了,服务器端,聊天界面的相关代码经过测试.大家都把自己的实验过程公布了,大家的交流对实验的进度也起到了很大的作用.明天我们要继续修改实验中的错误,然后大家一起把实验基 ...
- 剑指offer:用两个栈实现队列
题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 可以用stack1来存所有入队的数.在出队操作中,首先将stack1中的元素清空,转移到sta ...
- 【TCP/IP详解 卷一:协议】第六章:DHCP 和自动配置
简介 为了使用 TCP/IP 协议族,每台主机or路由器都需要一定的配置信息: IP地址 子网掩码 广播地址 路由或转发表 DNS 协议配置方法: 手动 通过使用网络服务来获得 使用一些算法来自动确定 ...
- 牛客网国庆集训派对Day5 题目 2018年
链接:https://www.nowcoder.com/acm/contest/205/L来源:牛客网参考博客:https://blog.csdn.net/HTallperson/article/de ...
- 树莓派与Arduino Leonardo使用NRF24L01无线模块通信之基于RF24库 (三) 全双工通信
设计思路 Arduino Leonardo初始化为发送模式,发送完成后,立即切换为接收模式,不停的监听,收到数据后立即切换为发送模式,若超过一定时间还为接收到数据,则切换为发送模式. 树莓派初始化为接 ...