题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=1853

题解:

容斥原理,暴力搜索,剪枝(这剪枝剪得真玄学)

首先容易发现,幸运号码不超过 2*(2^10) 个
然后考虑用容斥原理去得出所有近似幸运号码的个数,
即加上由单数个幸运号码的 LCM得到的近似幸运号码的个数,
然后减去由偶数个幸运号码的 LCM得到的近似幸运号码的个数,
(那个个数就是 N/LCM 嘛)。

实现方法是 DFS。
(DFS就是枚举每个幸运号码选或不选,并对答案加加减减就好了)
但显然会超时,22048 的复杂度,蛤。

优化如下:
1).
去掉幸运号码里的倍数。
即如果存在两个幸运号码 i,j,且 i%j==0,那么就不要 i了。
(然后就只剩下 943个了)
2).把幸运号码从大到小枚举。这样在搜索是可以在更靠近搜索树根的位置把剪枝减掉。
3).DFS时发现当前选的数的 LCM>边界,就return掉。

然后就可以玄学地过了。
至于复杂度分析,除了感觉很快,额、、、、
看了一位博主的分析:
如果把剩下的幸运号码看成两两互质的,那么 LCM就等于选的数相乘,
那么显然 sqrt(N)以上的数只能选一个,而小于sqrt(N)的数又只有 15个左右,
所以就很快了。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
bool mark[3000];
ll luck[3000],l,r,ans;
int cnt; bool fg;
ll gcd(ll a,ll b){
while(b^=a^=b^=a%=b);
return a;
}
void dfs(int p,int num,ll val,const ll &lim){
if(!p) return;
ll LCM=val/gcd(val,luck[p])*luck[p];
if(0<LCM&&LCM<=lim) ans+=1ll*lim/LCM*((num+1)%2?1:-1),dfs(p-1,num+1,LCM,lim);
dfs(p-1,num,val,lim);
}
ll solve(ll lim){
ans=0;
dfs(cnt,0,1,lim);
return ans;
}
void pre(int dep,ll val){
if(val) luck[++cnt]=val;
if(!dep) return;
pre(dep-1,val*10+6);
pre(dep-1,val*10+8);
}
int main()
{
filein(luckynumber);
fileout(luckynumber);
pre(10,0); int ccnt=0;
sort(luck+1,luck+cnt+1);
for(int i=1;i<=cnt;i++)
for(int j=1;j<i;j++) if(luck[i]%luck[j]==0) mark[i]=1;
for(int i=1;i<=cnt;i++) if(!mark[i]) luck[++ccnt]=luck[i]; cnt=ccnt;
scanf("%lld%lld",&l,&r);
printf("%lld",solve(r)-solve(l-1));
return 0;
}

●BZOJ 1853 [Scoi2010]幸运数字的更多相关文章

  1. BZOJ 1853: [Scoi2010]幸运数字

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

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

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

  3. bzoj 1853: [Scoi2010]幸运数字 容斥

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

  4. BZOJ 1853: [Scoi2010]幸运数字(容斥原理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1853 题意: 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运 ...

  5. bzoj 1853: [Scoi2010]幸运数字&&2393: Cirno的完美算数教室【容斥原理】

    翻了一些blog,只有我用状压预处理嘛2333,.把二进制位的0当成6,1当成8就行啦.(2393是2和9 然后\( dfs \)容斥,加上一个数的\( lcm \),减去两个数的\( lcm \), ...

  6. 【BZOJ 1853】 1853: [Scoi2010]幸运数字 (容斥原理)

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2472  Solved: 911 Description 在中国 ...

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

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

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

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

  9. AC日记——[SCOI2010]幸运数字 bzoj 1853

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

随机推荐

  1. IE浏览器支持响应式网站设计

    目前响应式网站设计比较流行, 下面是摘自百度百科有关响应式设计的定义. 响应式网站设计是一种网络页面设计布局,其理念是:集中创建页面的图片排版大小,可以智能地根据用户行为以及使用的设备环境进行相对应的 ...

  2. fabric.js和高级画板

    本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式.网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角 ...

  3. kali rolling更新源之gpg和dirmngr问题

    1.编辑 /etc/apt/source.list gedit /etc/apt/sources.list 输入更新源,可以选任何可用更新源,这里设置官方源 deb http://http.kali. ...

  4. python 中 reduce 函数的使用

    reduce()函数也是Python内置的一个高阶函数. reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接 ...

  5. Docker学习笔记 - Docker客户端和服务端

    学习内容: Docker客户端和服务端的通讯方式:client和自定义程序 Docker客户端和服务端的连接方式:socket 演示Docker客户端和服务端之间用remote-api通讯:nc   ...

  6. OAuth2.0学习(1-8) 授权方式五之Access_Token令牌过期更新

    OAuth2.0的Access_Token令牌过期更新 如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌. 客户端发 ...

  7. JavaScript中Array数组的方法

    查找: indexOf.lastIndexOf 迭代:every.filter.forEach.map.somereduce.reduceRight 用法: /* 1 查找方法: * arr.inde ...

  8. anaconda的使用

    1. 查看已安装的库 pip list conda list 其中,pip list 只能查看库,而 conda list 则可以查看库以及库的版本 2. 安装或更新库 pip install scr ...

  9. requests-证书验证

    import requests #response = requests.get('https://www.12306.cn') #print(response.status_code) #以上会显示 ...

  10. 关于 String,StringBuilder,StringBuffer

    关于 String,StringBuilder,StringBuffer 的讨论,已有很多文章:在这里,我希望能刨根问底,更进一步的理解其中的原理. String String 是final类型,不可 ...