BZOJ 1853 [Scoi2010]幸运数字 容斥
2017-10-07 21:11
495 查看
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和bOutput
输出数据是一行,包括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
可以看到幸运数字是不多的,10^10内也就2000+个。
可以用dfs直接预处理出所有的幸运数字,然后求它们倍数的个数。
由于可能会重复,我们暴力判断某一个幸运数字x,
是不是另一个幸运数字y的倍数,
假如是的话,直接把x无视掉就可以了。
<
4000
span style="font-size:18px;">
然后就是一个容斥的dfs做法。
暴力写一个dfs,求出lcm,对于范围W,那么倍数个数就是W/lcm,,
按理来说很暴力= =实际上有可以优化的。
lcm会爆long long……或者说超过b,
那么如果lcm>b了直接return即可。
还有就是当数大的时候,被无视掉的幸运数还是很多的。
有个讨厌的地方……由于会爆long long,而long long溢出的时候会变负,
所以判断是否<0也可剪枝。
天真地以为不会爆long long= =
#include<bits/stdc++.h> #define ll long long using namespace std; int n; ll A,B,ans; ll xys[3000]; bool flag[3000]; ll gcd(ll a,ll b){ if (!b) return a; else return gcd(b,a%b); } void dfs(ll S){ if (S>B) return; if (S) xys[++n]=S; dfs(S*10+6),dfs(S*10+8); } void Unique(){ sort(xys+1,xys+1+n); for (int i=2;i<=n;i++) for (int j=1;j<i;j++) if (!(xys[i]%xys[j])) flag[i]=1; } void DFS(ll LCM,int now,int num){ if (!now) return; DFS(LCM,now-1,num); if (flag[now]) return; ll t=LCM,t1=gcd(LCM,xys[now]); LCM=LCM/t1*xys[now]; if (LCM<=0LL || LCM>B) return; num++; if (num&1) ans+=B/LCM-A/LCM; else ans-=B/LCM-A/LCM; DFS(LCM,now-1,num); } int main(){ scanf("%lld%lld",&A,&B); A--; n=0,dfs(0LL); Unique(); ans=0,DFS(1LL,n,0); printf("%lld\n",ans); return 0; }
相关文章推荐
- BZOJ2393 & 1853 [Scoi2010]幸运数字 【搜索 + 容斥】
- bzoj 1853: [Scoi2010]幸运数字 容斥
- [bzoj-1853][Scoi2010]幸运数字 题解
- BZOJ 1853: [Scoi2010]幸运数字(容斥原理)
- 【BZOJ 1853】[Scoi2010]幸运数字 【容斥原理】
- BZOJ 1853: [Scoi2010]幸运数字
- BZOJ1853 [Scoi2010]幸运数字
- bzoj 1853: [Scoi2010]幸运数字&&2393: Cirno的完美算数教室【容斥原理】
- AC日记——[SCOI2010]幸运数字 bzoj 1853
- 【bzoj 1853】 [Scoi2010] 幸运数字
- BZOJ1853 [Scoi2010]幸运数字 [容斥原理]【组合数学】
- 【BZOJ 1853】【SCOI 2010】幸运数字
- ●BZOJ 1853 [Scoi2010]幸运数字
- bzoj 1853: [Scoi2010]幸运数字(容斥原理)
- [BZOJ]1853: [Scoi2010]幸运数字 容斥原理
- BZOJ_2393_Cirno的完美算数教室&&BZOJ_1853_[Scoi2010]幸运数字 _深搜+容斥原理
- BZOJ 1853 [Scoi2010]幸运数字 (容斥原理)
- Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜
- BZOJ 1853: [Scoi2010]幸运数字
- BZOJ 1853 【SCOI2010】 幸运数字