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

题解 P7586 [COCI2012-2013#1] SNAGA

洛谷

题意

应该好理解,没理解的话可以看一下下面暴力的代码。

分析

观察这种题,范围 3A<B1017,首先就只有几种算法了(至少我没学过多少种):倍增,矩阵快速幂,数学,数位 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 的。

由此,我们再次分析一下我们的操作,可以得到几个性质(令 fi 表示 i 的最小的不能整除的数):

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

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

输出一下前缀的 lcm:

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

再分析一下 fi 在数字上的性质,进而判断 leni 的数值。

先给出结论:

  1. i 是一个奇数,那么 leni=2
  2. fi 是一个奇数,那么 leni=3
  3. fi 是一个偶数,那么 leni=4

这三个结论中的前两个都应该是很显然的,着重分析一下第 3 个。

因为 fi 是一个偶数,我们令 fi=2×k,那么 k 也就已经判断过,是 i 的因数。
那为什么我们的 2×k 不是其因数了呢?是因为我们增加了一个 2 的因数。
因此,我们对其造成关键的实际上是 2q,(q2×k2 的最大幂次)。
2q2×k,由此,我们的 fi 应当就是 2q,而 f2q=3。由此,得出我们的结论 3。

最后轮到了如何求答案了,我们分开处理三种数,可能不太好算,我们令其一部分放在一起考虑。

我们令基础的贡献为 3,那么,我们只要减去奇数的个数,就可以处理出 1,2 的贡献,同时,计算了一部分的 3,我们只需要加上第三种数字的个数即可。

对于这一部分,我们又要分成 4 种,根据 fi 的种类分类,因为 fi42fi=2q,所以此时的 fi 只有四种可能:4、8、16、32。

要使 fix,我们需要使 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 @   djh0314  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示