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]幸运数字 容斥原理+搜索的更多相关文章

  1. BZOJ1853 [Scoi2010]幸运数字 容斥原理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1853 题意概括 求一个区间范围内,近似幸运数字的个数. 定义: 幸运数字:仅由6或者8组成的数字. ...

  2. 【BZOJ1853】幸运数字(搜索,容斥)

    [BZOJ1853]幸运数字(搜索,容斥) 题面 BZOJ 洛谷 题解 成功轰下洛谷rk1,甚至超越了一个打表选手 这题思路很明显吧,先搞出来所有范围内的合法数字,然后直接容斥, 容斥的话显然没有别的 ...

  3. BZOJ1853 Scoi2010 幸运数字 【枚举+容斥】

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

  4. [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3202  Solved: 1198[Submit][Status ...

  5. Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1774  Solved: 644[Submit][Status] ...

  6. BZOJ2393 & 1853 [Scoi2010]幸运数字 【搜索 + 容斥】

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

  7. bzoj1853[Scoi2010]幸运数字 容斥

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3027  Solved: 1128[Submit][Status ...

  8. 1853: [Scoi2010]幸运数字[容斥原理]

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status] ...

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

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

随机推荐

  1. 用纯js实现一个文本编辑器

    效果图 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  2. 微信小程序之 wx.getUserInfo引导用户授权问题

    首先,在page外定义一个函数用户判断是否为空对象 var isEmptyObject = function (e) { var temp; for (temp in e) ; } 然后,在page中 ...

  3. 使用CallableStatement接口调用存储过程

    直接上下代码: package com.learn.jdbc.chap07; import java.sql.CallableStatement; import java.sql.Connection ...

  4. Apple Ad Hoc

    Apple Ad Hoc 发布测试 App只能通过Ad Hoc分享给绑定我们账号的设备上,所以至是一百台 1.官网member Center创建Ad Hoc证书 2.在官网下载Ad Hoc证书到mac ...

  5. ActiveX每次网页打开提示活动内容运行

    (2)       设置允许活动内容运行. 在启动调试,网页经常会呈现如下提示框,每次都要确认,很麻烦. 以下方法可以消除这个提示框. 在IE中打开Internet 选项对话框,选择高级选项卡,勾选里 ...

  6. kibana.yml(中文配置详解)

    # Kibana is served by a back end server. This controls which port to use. # server.port: 5601 # The ...

  7. ssh免密连接远程服务器

    ssh免密连接远程服务器 借助ssky-keygen和ssh-copy-id工具,通过4个简单的步骤实现无需输入密码登录远程Linux主机 1 生成密钥 通过内置的工具生成RSA算法加密的密钥 ssh ...

  8. cmd命令删除文件及文件夹

    rmdir /s/q wenjianming 其中: /s 是代表删除所有子目录跟其中的档案. /q 是不要它在删除档案或目录时,不再问我 Yes or No 的动作.

  9. git获取网上的项目

    这里是从coding.net上下载项目至本地phpstorm并配置好相关环境. 这里url地址正是项目路径.获取的地方是: 下面那个url直接复制粘贴. 自己选择一个目录,然后clone. 下面便是前 ...

  10. 把List<string>转为DataTable

    //把List<string>转为DataTable List<string> myList = new List<string>(); DataTable dt2 ...