【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/转 ...
随机推荐
- 2018Java年底总结
一年又过去了,这是我的第二年的JAVA开发,总感觉有很多想说的,可惜语言组织能力着实一般,以下列举一些今年的总结. 1.首先告诫一下新入行或者新入职经验不多的小伙伴,写sql的时候根据业务能单表就单表 ...
- dstat 性能测试工具常用选项
dstat常用的选项有: -c 显示cpu使用情况 -d 显示磁盘使用情况 -g, 显示页面数据 -i 启用中断数据 -l 平均负载统计(1分钟,5分钟,1 ...
- 《The Mythical Man-Month(人月神话)》读后感(1)
临近考试周,这里我通过平时阅读的<人月神话>十九个章节和知乎.简书等网页中网友们对<人月神话>的读后感,对书中各个章节进行简单的总结,以下均为个人手打观点的思考与整合,仅供大家 ...
- SQL面经汇总
转载链接:https://www.nowcoder.com/discuss/95812 目前的打算是还要写一个假设检验的汇总和机器学习的汇总. 之前写的概率论汇总: https://www.nowco ...
- Tomcat之初识初体验
1.what's this? Stable performance, free Java web application server! 相关: Java,Javac,JVM,JRE,JDK,Java ...
- python2.6更改为Python2.7
文中为Python2.6.6,改为Python2.6即可,因为没有/usr/bin/python2.6.6,只有/usr/bin/python2.6 http://blog.csdn.net/jcjc ...
- string类型和int类型之间的转换
一.string转int 1. 使用string流 /* 字符串转整型 */ /* * istringstream:从 string 读取数据 * ostringstream:向 string 写入数 ...
- Task 4.4二维环形数组求最大子矩阵之和
任务: (1)输入一个二维整形数组,数组里有正数也有负数. (2)二维数组首尾相接,象个一条首尾相接带子一样. (3)数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. (4)求所有子数 ...
- APP分析----饿了么
产品 饿了么 选择原因:有了外卖就可以轻松拥有一个不用出门也饿不着的爽歪歪周末. 第一部分 调研, 评测 下载软件并使用起来,描述最简单直观的个人第一次上手体验. 主界面: 第一次上手是大一 ...
- C# 正则提取字符串(提取一个或多个)
实例一:string result = ""; string str = "大家好! <User EntryTime='2010-10-7' Email='zhan ...