【BZOJ1853】[Scoi2010]幸运数字 容斥原理+搜索
Description
在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”。lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”。 现在lxhgww想知道在一段闭区间[a, b]内,“近似幸运号码”的个数。
Input
输入数据是一行,包括2个数字a和b
Output
输出数据是一行,包括1个数字,表示在闭区间[a, b]内“近似幸运号码”的个数
Sample Input
【样例输入1】
1 10
【样例输入2】
1234 4321
Sample Output
【样例输出1】
2
【样例输出2】
809
HINT
【数据范围】
对于30%的数据,保证1 < =a < =b < =1000000
对于100%的数据,保证1 < =a < =b < =10000000000
Sol
这题刚看上去似乎是个数位dp...不过是假的...
首先幸运数字只有\(2^{11}\)个,我们可以暴力找到它们,然后暴力去掉倍数。
然后我们考虑近似幸运号码,我们发现如果把每个幸运数字的倍数都标记的话,每个数字的标记次数好像是和组成lcm的幸运数字个数有关的(说白了就是容斥),所以我们每次取几个幸运数字,求lcm,然后大力按照选择数字的个数判断系数容斥一波,算区间某个数的倍数出现次数当然是直接用\(((r/x)-((l-1)/x))\)算啦。
到这里这道题好像就完了......但是dfs的时候注意一下,lcm好像是会爆long long的,我们用long double判断某个数字有没有越界,越界了就不搜这个数字了。
还有,一定要倒着搜,这样的话状态少!!!否则会TLE!!!
时间复杂度\(能过O(能过)\)。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll l,r,n,vis[10005],a[10005],tot=-1,ans;
void get(ll x){if(x>r) return;a[++tot]=x;get(x*10+6);get(x*10+8);}
void dfs(int now,int cnt,ll x)
{
if(now>n){if(!cnt) return;ans+=((cnt&1)?1:-1)*((r/x)-((l-1)/x));return;}
dfs(now+1,cnt,x);
ll tmp=x/__gcd(a[now],x);
if((long double)tmp*a[now]<=r) dfs(now+1,cnt+1,tmp*a[now]);
}
int main()
{
scanf("%lld%lld",&l,&r);get(0);sort(a+1,a+tot+1);
for(int i=1;i<=tot;i++) for(int j=i+1;j<=tot;j++) if(a[j]%a[i]==0) vis[j]=1;
for(int i=1;i<=tot;i++) if(!vis[i]) a[++n]=a[i];
for(int i=1,j=n;i<j;i++,j--) swap(a[i],a[j]);
dfs(1,0,1);printf("%lld\n",ans);
}
【BZOJ1853】[Scoi2010]幸运数字 容斥原理+搜索的更多相关文章
- BZOJ1853 [Scoi2010]幸运数字 容斥原理
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1853 题意概括 求一个区间范围内,近似幸运数字的个数. 定义: 幸运数字:仅由6或者8组成的数字. ...
- 【BZOJ1853】幸运数字(搜索,容斥)
[BZOJ1853]幸运数字(搜索,容斥) 题面 BZOJ 洛谷 题解 成功轰下洛谷rk1,甚至超越了一个打表选手 这题思路很明显吧,先搞出来所有范围内的合法数字,然后直接容斥, 容斥的话显然没有别的 ...
- BZOJ1853 Scoi2010 幸运数字 【枚举+容斥】
BZOJ1853 Scoi2010 幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号 ...
- [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 3202 Solved: 1198[Submit][Status ...
- Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1774 Solved: 644[Submit][Status] ...
- BZOJ2393 & 1853 [Scoi2010]幸运数字 【搜索 + 容斥】
题目 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是" ...
- bzoj1853[Scoi2010]幸运数字 容斥
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 3027 Solved: 1128[Submit][Status ...
- 1853: [Scoi2010]幸运数字[容斥原理]
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 2405 Solved: 887[Submit][Status] ...
- bzoj1853: [Scoi2010]幸运数字 dp+容斥原理
在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是 ...
随机推荐
- 用纯js实现一个文本编辑器
效果图 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- 微信小程序之 wx.getUserInfo引导用户授权问题
首先,在page外定义一个函数用户判断是否为空对象 var isEmptyObject = function (e) { var temp; for (temp in e) ; } 然后,在page中 ...
- 使用CallableStatement接口调用存储过程
直接上下代码: package com.learn.jdbc.chap07; import java.sql.CallableStatement; import java.sql.Connection ...
- Apple Ad Hoc
Apple Ad Hoc 发布测试 App只能通过Ad Hoc分享给绑定我们账号的设备上,所以至是一百台 1.官网member Center创建Ad Hoc证书 2.在官网下载Ad Hoc证书到mac ...
- ActiveX每次网页打开提示活动内容运行
(2) 设置允许活动内容运行. 在启动调试,网页经常会呈现如下提示框,每次都要确认,很麻烦. 以下方法可以消除这个提示框. 在IE中打开Internet 选项对话框,选择高级选项卡,勾选里 ...
- kibana.yml(中文配置详解)
# Kibana is served by a back end server. This controls which port to use. # server.port: 5601 # The ...
- ssh免密连接远程服务器
ssh免密连接远程服务器 借助ssky-keygen和ssh-copy-id工具,通过4个简单的步骤实现无需输入密码登录远程Linux主机 1 生成密钥 通过内置的工具生成RSA算法加密的密钥 ssh ...
- cmd命令删除文件及文件夹
rmdir /s/q wenjianming 其中: /s 是代表删除所有子目录跟其中的档案. /q 是不要它在删除档案或目录时,不再问我 Yes or No 的动作.
- git获取网上的项目
这里是从coding.net上下载项目至本地phpstorm并配置好相关环境. 这里url地址正是项目路径.获取的地方是: 下面那个url直接复制粘贴. 自己选择一个目录,然后clone. 下面便是前 ...
- 把List<string>转为DataTable
//把List<string>转为DataTable List<string> myList = new List<string>(); DataTable dt2 ...