题解 P7586 [COCI2012-2013#1] SNAGA
洛谷。
题意
应该好理解,没理解的话可以看一下下面暴力的代码。
分析
观察这种题,范围 $3\le A < B \le 10^{17}$,首先就只有几种算法了(至少我没学过多少种):倍增,矩阵快速幂,数学,数位 DP,循环,或一些特殊情况。
而这题,他有一个不能整除的性质,看来只有数学来解决了,先确定了一个大的方向。
先打一个暴力,打个小表来分析一下性质:
inline int js(int x) {
if(x==2) return 1;
for(int j=2;j<=x;++j) if(x%j) return 1+js(j);
}
输出前一百个观察一下:

再随机几个我们发现,所有的 $len$ 都是小于等于 $4$ 的。
由此,我们再次分析一下我们的操作,可以得到几个性质(令 $f_i$ 表示 $i$ 的最小的不能整除的数):
- 奇数的 $len$ 必然为 $2$。
- 所有小于 $f_i$ 的数都是 $i$ 的因数。
看起来有点像废话?所有小于 $f_i$ 的数都是 $i$ 的因数,这也就导致,我们的前 $f_i$ 个数的 lcm。
输出一下前缀的 lcm:
当我们的 $i$ 大于 $42$ 时,就已经超过了我们的范围了,因此,我们的 $f_i\le 42$,这是第一个衍生性质。
再分析一下 $f_i$ 在数字上的性质,进而判断 $len_i$ 的数值。
先给出结论:
- $i$ 是一个奇数,那么 $len_i=2$;
- $f_i$ 是一个奇数,那么 $len_i=3$;
- $f_i$ 是一个偶数,那么 $len_i=4$。
这三个结论中的前两个都应该是很显然的,着重分析一下第 3 个。
因为 $f_i$ 是一个偶数,我们令 $f_i=2\times k$,那么 $k$ 也就已经判断过,是 $i$ 的因数。
那为什么我们的 $2\times k$ 不是其因数了呢?是因为我们增加了一个 $2$ 的因数。
因此,我们对其造成关键的实际上是 $2^q$,($q$ 为 $2\times k$ 的 $2$ 的最大幂次)。
而 $2^q\le 2\times k$,由此,我们的 $f_i$ 应当就是 $2^q$,而 $f_{2^q}=3$。由此,得出我们的结论 3。
最后轮到了如何求答案了,我们分开处理三种数,可能不太好算,我们令其一部分放在一起考虑。
我们令基础的贡献为 3,那么,我们只要减去奇数的个数,就可以处理出 1,2 的贡献,同时,计算了一部分的 3,我们只需要加上第三种数字的个数即可。
对于这一部分,我们又要分成 4 种,根据 $f_i$ 的种类分类,因为 $f_i\le 42$,$f_i=2^q$,所以此时的 $f_i$ 只有四种可能:4、8、16、32。
要使 $f_i$ 是 $x$,我们需要使 $i$ 使 $x$ 前面所有数的 lcm 的因数,同时不被 $x$ 整除,用一个小小容斥即可。
for(int i=2;i<=5;++i) {
res+=x/num[i];//num为预处理的前缀lcm
ll y=num[i]*(1<<i)/__gcd(num[i],(1<<i));
if(y<0) continue;//防止爆
res-=x/y;
}

浙公网安备 33010602011771号