传送门->

据说本题的正确读法是【shìng运数字】。

听上去本题很适合暴力,于是并不对劲的人就去写了。其实这题就是一个很普(有)通(趣)暴力+神奇的优化。

首先,会发现幸运数字很少,那么就先搜索出所有幸运数字。

找出每个幸运数字后,会发现每一个数在[a,b]出现了多少次是可以直接算出的,就是floor(b/x)-ceil(a/x)+1。

但是直接加想必是不行的,因为两个数的lcm被算重复了。这时直接容斥会不会T或者出一些奇怪的问题?当然会。所以不能直接容斥,要加些优化再容斥。

1.有些幸运数字是其它幸运数字的倍数,要它何用?

2.当lcm>b时,[a,b]中肯定没有lcm的倍数,要剪掉。

3.lcm(x,y)=x*y/gcd(x,y),会发现x*y可能会爆long long,用double来存。

#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register LL i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register LL i=(x);i>=(y);--i)
#define re register
#define LL long long
#define LCM(x,y) ((x)*(y)/gcd((x),(y)))
using namespace std;
inline LL read()
{
LL x=0,f=1;
char ch=getchar();
while(isdigit(ch)==0 && ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void write(LL x)
{
LL f=0;char ch[20];
if(!x){puts("0");return;}
if(x<0){putchar('-');x=-x;}
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
}
LL ten[15],a,b,luck[8200],ans,inf[3];
int lena,lenb,cnt,tim;
int getten(LL x){rep(i,0,10)if(ten[i]<=x&&ten[i+1]>x)return i;}
void reset(){ten[0]=1;rep(i,1,11)ten[i]=ten[i-1]*10;}
void force(int x,int tot,LL tmp)
{
tim++;
if(x==tot+1){/*cout<<"+"<<endl;*/luck[++cnt]=tmp;return;}
force(x+1,tot,tmp+6*ten[x]),force(x+1,tot,tmp+8*ten[x]);
}
LL gcd(LL x,LL y)
{
if(x>y)swap(x,y);
if(x==0)return y;
return gcd(y%x,x);
}
void search(int x,int step,LL lcm)
{
if(lcm>b)return;
if(step==cnt){if(!x)return;ans+=(x&1?1:-1)*(((b/lcm)-(a+lcm-1)/lcm)+1);return;}
search(x,step+1,lcm);
LL tmp=lcm/gcd(lcm,luck[step+1]);
if(1.0*tmp*luck[step+1]<=b)
search(x+1,step+1,tmp*luck[step+1]);
}
bool cmp(LL x,LL y){return x>y;}
int main()
{
memset(inf,0x7f,sizeof(inf));
reset();
a=read(),b=read();
lenb=getten(b);
rep(i,0,lenb)
force(0,i,0);
// cout<<tim<<endl;
sort(luck+1,luck+cnt+1,cmp);
rep(i,1,cnt)
if(luck[i]!=-inf[0])
rep(j,i+1,cnt)
if(luck[j]!=-inf[0]&&luck[i]%luck[j]==0)luck[i]=-inf[0];
luck[cnt+1]=-inf[0];
sort(luck+1,luck+cnt+1,cmp);
// rep(i,1,cnt)cout<<luck[i]<<endl;
cnt=0;
while(luck[cnt+1]!=-inf[0])cnt++;
// cout<<"shing"<<endl;
search(0,0,1);
write(ans);
return 0;
}
//1 10000000000

 并不对劲的暴力选手表示写完后身心愉悦。

并不对劲的bzoj1853:[SCOI2010]幸运数字的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ1853 [Scoi2010]幸运数字

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  6. 2019.01.17 bzoj1853: [Scoi2010]幸运数字(容斥+dfs)

    传送门 搜索菜题,然而第一次没有注意然后爆longlonglong longlonglong了. 题意:称所有数位由6,86,86,8组成的数为幸运数字,问一个一个区间[l,r][l,r][l,r]中 ...

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

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

  8. 【bzoj1853】: [Scoi2010]幸运数字 数论-容斥原理

    [bzoj1853]: [Scoi2010]幸运数字 预处理出所有幸运数字然后容斥原理 但是幸运数字是2logn个数的 直接搞会炸 所以把成倍数的处理掉 然后发现还是会T 所以数字要从大到小处理会快很 ...

  9. 【BZOJ1853/2393】[Scoi2010]幸运数字/Cirno的完美算数教室 DFS+容斥

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

随机推荐

  1. 查看java进程中哪个线程在消耗系统资源

    1 top -p $pid -H  加上-H这个参数后,会列出有哪些线程.这样就可以看到哪个线程id最消耗系统资源了.看到的线程id是10进制的数字. 2 jstack $pid 可以打印出制定jav ...

  2. hihoCoder#1139 二分·二分答案

    原题地址 挺简单一道题,结果因为一时傻逼写错一个小地方,导致WA成狗了_(:з」∠)_ 代码: #include <iostream> #include <cstring> # ...

  3. hdu 2181暴搜

    #include<stdio.h> #include<string.h> #define N 30 int map[N][4],total; void dfs(int n,in ...

  4. msp430入门编程27

    msp430中C语言开发工具调试程序 msp430入门学习 msp430入门编程

  5. Python高级进阶(一)Python框架之Django入门

    传说中的Django Django由来 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下 ...

  6. Sudoku Killer--hdu1426(数独 跟上一题差不多 但是输入时问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1426 注意输入问题就行 还是dfs #include<stdio.h> #include<st ...

  7. HDU 4786 Fibonacci Tree(生成树,YY乱搞)

    http://acm.hdu.edu.cn/showproblem.php? pid=4786 Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others ...

  8. Meteor第一个应用程序

    这一个小教程将教你如何建立你的第一个 Meteor 应用程序. 步骤 1 - 创建App 要创建应用程序,我们将从命令提示符窗口运行 meteor create 命令.该应用程序的名称是 meteor ...

  9. OpenGL蓝宝书第七章:立体天空和纹理折射、双纹理(下)

    对照了蓝宝书,才知道红宝书的长处. reflect函数的原理在红宝书中有说明,仅仅有对照了红宝书,才知道红宝书的定位:高级工具书. 蓝宝书作为入门级书籍,以较快的速度让读者敲到代码去思考,总遗留了须要 ...

  10. O2O助汪峰成功逆袭,汪峰最终上头条了

    8月2日七夕情人节,汪峰<峰暴来临>演唱会在鸟巢10万人体育场唱响,各大报纸.站点娱乐板块并没有等来汪峰向国际章求婚的"头条",只是,与乐视合作现场演出+付费直播的O2 ...