把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解 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$ 的最小的不能整除的数):

  1. 奇数的 $len$ 必然为 $2$。
  2. 所有小于 $f_i$ 的数都是 $i$ 的因数。

看起来有点像废话?所有小于 $f_i$ 的数都是 $i$ 的因数,这也就导致,我们的前 $f_i$ 个数的 lcm。

输出一下前缀的 lcm:

当我们的 $i$ 大于 $42$ 时,就已经超过了我们的范围了,因此,我们的 $f_i\le 42$,这是第一个衍生性质。

再分析一下 $f_i$ 在数字上的性质,进而判断 $len_i$ 的数值。

先给出结论:

  1. $i$ 是一个奇数,那么 $len_i=2$;
  2. $f_i$ 是一个奇数,那么 $len_i=3$;
  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;
}
posted @ 2023-08-17 20:52  djh0314  阅读(31)  评论(0)    收藏  举报  来源
浏览器标题切换
浏览器标题切换end