时间限制:2秒 内存限制:128M
【问题描述】
在中国,很多人都把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
【样例2】
1234 4321
【输出样例】
【样例1】
2
【样例2】
809
【数据范围】
对于30%的数据,保证1<=a<=b<=1000000
对于100%的数据,保证1<=a<=b<=10000000000
【来源】
bzoj1853
这道题我一看暴力嘛,直接做。
把所以的由6和8组成的数生成了出来,靠倍数去了一下(有它的因数的数不要,原因请自行理解),然后发现不行,要用容斥原理,数了一下gg。
当时不知道怎么想的真的就暴力出来了,前9个数用容斥,从第10个数开始就至少6666了,那就好办了。
我们先枚局每个数,再用它与所有比它小的数取次最大公倍数来除以比它小的那个数,这样我们可以得到他们最小公倍数是取出来的这个数的多少倍,然后我们直接标记这些倍数就可以了。
因为最小的数都有6666,所有倍数最多也就10000000000/6666了,自己算一下其实也就1500150.0150015,取个整最多1500151,完全可以标记的。
就这样发疯了的我就把它暴力出来了,俗话说的好,暴力出奇迹。
代码如下:
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorit