[SCOI2010]幸运数字
2017-08-02 19:05
309 查看
题目描述
在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”。lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”。现在lxhgww想知道在一段闭区间[a, b]内,“近似幸运号码”的个数。
输入输出格式
输入格式:输入数据是一行,包括2个数字a和b
输出格式:
输出数据是一行,包括1个数字,表示在闭区间[a, b]内“近似幸运号码”的个数
输入输出样例
输入样例#1:1 10
输出样例#1:
2
说明
对于30%的数据,保证1<=a<=b<=1000000对于100%的数据,保证1<=a<=b<=10000000000
[b]题解:[/b]
[b]容斥原理+dfs[/b]
[b]存在左界不难,只要容斥时减去左边的伪幸运数,假设要求[a,b],其中一个因数为p1[/b]
[b]只要由b/p1->b/p1-(a-1)/p1[/b]
[b]首先dfs求出所有幸运数字,[/b]
[b]总方案ans=(b/p1-(a-1)/p)+(b/p2-(a-1)/p)+...-(b/p1p2-(a-1)/p1p2)-......[/b]
[b]不过直接dfs显然超时[/b]
[b]优化:[/b]
[b]1.减小搜索范围,根据容斥原理,可以知道当px|py时,py与px显然重合且py无用,直接去掉,形成新的幸运数组[/b]
[b]2.时刻判断lcm(s,x)是否超过r,超过则不选该数x,记住判断时由于数太大,可能会溢出,所以要把判断换一下[/b]
[b] s*x/gcd(s,x)<=r ->s/gcd(s,x)<=(double)r/x这里的double是为防止整形判断有误(应该不会错,但会慢一点)[/b]
[b]3.完成以上2步应该是60分,还有关键一点:调整搜索顺序[/b]
[b]显然先从大的幸运数开始容斥,会在开始时产生较少的分支,而搜索算法的搜索树靠近根的分支越少就越快[/b]
[b]所以将幸运数重新排序就可以AC了,比原来快的多[/b]
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; typedef long long lol; lol luck[3001],l,r,ans; int cnt; bool cmp(lol a,lol b) { return a>b; } void dfs_pre(lol s) { if (s>r) return; if (s) { cnt++; luck[cnt]=s; } dfs_pre(s*10+6); dfs_pre(s*10+8); } lol gcd(lol a,lol b) { if (!b) return a; return gcd(b,a%b); } void dfs(int x,lol s,int f) { if (x==0) { ans+=f*(r/s-(l-1)/s); return; } lol g=gcd(s,luck[x]); if ((double)s/(double)g<=(double)r/(double)luck[x]) dfs(x-1,s/g*luck[x],f*(-1)); dfs(x-1,s,f); } int main() {int i,j; cin>>l>>r; dfs_pre(0); for (i=1;i<=cnt;i++) { for (j=1;j<i;j++) if (luck[j]!=-1&&luck[i]%luck[j]==0) luck[i]=-1; } sort(luck+1,luck+cnt+1,cmp); for (i=cnt;i>=1;i--) if (luck[i]==-1) cnt--; sort(luck+1,luck+cnt+1); dfs(cnt,1,-1); cout<<r-l+1+ans; }
相关文章推荐
- BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理
- 【bzoj 1853】 [Scoi2010] 幸运数字
- [BZOJ1853][Scoi2010]幸运数字(容斥原理)
- BZOJ 1853: [Scoi2010]幸运数字(容斥原理)
- [BZOJ]1853: [Scoi2010]幸运数字 容斥原理
- 1853: [Scoi2010]幸运数字
- [Scoi2010]幸运数字解题报告
- [BZOJ1853][SCOI2010]幸运数字(DFS+容斥)
- 【BZOJ1853/2393】[Scoi2010]幸运数字/Cirno的完美算数教室 DFS+容斥
- 【b aa21 zoj1853】【scoi2010】幸运数字
- BZOJ2393 & 1853 [Scoi2010]幸运数字 【搜索 + 容斥】
- 【BZOJ 1853】[Scoi2010]幸运数字 【容斥原理】
- [bzoj1853][Scoi2010][幸运数字] (容斥原理)
- bzoj2393/bzoj1853 Cirno的完美算数教室/[Scoi2010]幸运数字 搜索+容斥
- 【SCOI2010】【BZOJ1853】幸运数字
- bzoj1853【scoi2010】幸运数字(暴力出奇迹)
- bzoj1853: [Scoi2010]幸运数字 dp+容斥原理
- bzoj 1853: [Scoi2010]幸运数字(容斥原理)
- BZOJ 1853 [Scoi2010]幸运数字 容斥
- BZOJ 1853 【SCOI2010】 幸运数字