\(\text{Poblem}\)

求 \(\sum_{i=l}^r \mu(i)\)

\(1 \le l,r \le 10^{18}, r - l \le 10^5\)

\(\text{Analysis}\)

我们做过 \(r,l \le 10^{12}\) 次方的区间筛积性函数

但这是因为 \(\sqrt r\) 内的素数可以快速筛出来

又可以用这些素数处理 \(r \le 10^{12}\) 的数的积性函数

但现在 \(\sqrt r\) 已经达到 \(10^9\) 级别了

\(so...\)

我们仍然用 \(10^6\) 以内的素数处理,并将原来的数除掉这些素数

那么剩下的数 \(x\) 只有三种形式

\(3.x=p^2\)

\(2.x=p\)

\(1.x=pq\)

\(p,q \in \mathbb P,p \not = q\)

考虑第一种情况,只需要判断 \(\sqrt x\) 强转整型后再平方是否等于 \(x\)

考虑第二种情况,由于 \(x\) 可能非常大,那么就需要 \(\text{Miller Rabin}\) 来判断素数

考虑第三种情况,两个不等的素数,\(\mu\) 不变,且判完前两个情况只剩这种情况,不必再考虑

愉快解决

\(\text{Code}\)

#include<cstdio>
#include<algorithm>
#include<ctime>
#include<cmath>
using namespace std;
typedef long long LL; const int R = 100005;
LL l, r, num[R];
int prime[600005], totp, mu[R], vis[1000005]; inline LL sqr(LL x){return x * x;} inline void getprime()
{
for(int i = 2; i <= 1e6; i++)
{
if (!vis[i]) prime[++totp] = i;
for(int j = 1; j <= totp && i * prime[j] <= 1e6; j++)
{
vis[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
} inline LL fmul(LL x, LL y, LL p)
{
return (x * y - (LL)((long double)x / p * y) * p + p) % p;
}
inline LL fpow(LL x, LL y, LL p)
{
LL res = 1;
for(; y; y >>= 1)
{
if (y & 1) res = fmul(res, x, p);
x = fmul(x, x, p);
}
return res;
}
inline int Miller_Rabin(LL p)
{
srand(time(0));
if (p <= 3) return (p == 2 || p == 3);
if (!(p & 1)) return 0;
LL d = p - 1, b = 0;
while (!(d & 1)) d >>= 1, b++;
for(int i = 0; i < 3; i++)
{
LL a = rand() % (p - 3) + 2, u = fpow(a, d, p), v;
for(int j = 0; j < b; j++)
{
v = fmul(u, u, p);
if ((v == 1) && (u != 1) && (u != p - 1)) return 0;
u = v;
}
if (u != 1) return 0;
}
return 1;
} inline LL solve()
{
for(int i = 1; i <= r - l + 1; i++) mu[i] = 1, num[i] = l + i - 1;
for(int i = 1; i <= totp && prime[i] <= r; i++)
for(LL j = max(1LL, l / prime[i]); j * prime[i] <= r; j++)
if (j * prime[i] >= l)
{
if (j % prime[i] == 0) mu[j * prime[i] - l + 1] = 0;
else mu[j * prime[i] - l + 1] *= -1, num[j * prime[i] - l + 1] /= prime[i];
}
for(int i = 1; i <= r - l + 1; i++)
{
if (!mu[i] || num[i] == 1) continue;
if (sqr(sqrt(num[i])) == num[i]) mu[i] = 0;
else if (Miller_Rabin(num[i])) mu[i] *= -1;
}
LL ans = 0;
for(int i = 1; i <= r - l + 1; i++) ans += mu[i];
return ans;
} int main()
{
scanf("%lld%lld", &l, &r);
getprime();
printf("%lld\n", solve());
}

最新文章

  1. JavaScript 常量定义
  2. 自己写一个swap函数交换任意两个相同类型元素的值 对空指针的使用 字节大小的判断(二)了解原理
  3. PKU 1003解题
  4. 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(二)ActionSheet视图 学习笔记
  5. web farm 讨论引出
  6. IISExpress配置文件的一个坑
  7. 【BZOJ 3476】 线段树===
  8. dojo事件
  9. SQL Server2008不允许修改表结构解决办法
  10. JVM之GC算法、垃圾收集算法——标记-清除算法、复制算法、标记-整理算法、分代收集算法
  11. 用tensorflow实现最简单的神经网络
  12. .NET并行计算和并发8:硬件支持
  13. Tomcat延迟启动
  14. Android开发中遇到的问题(一)——Android模拟器端口被占用问题的解决办法
  15. 获取SQL数据库表空间结构
  16. 3.如何在Maven项目中引入自己的jar包
  17. 四则运算生成器(java) 蔡苑菲,陆海燕
  18. django1.8 增加注册用户其他字段(用户扩展)
  19. java入门---运算符&amp;逻辑运算符&amp;短路逻辑运算符&amp;赋值运算符&amp;条件运算符&amp;instanceof 运算符
  20. split 将字符串分割成字符串数组

热门文章

  1. Spring Boot回顾
  2. 如何理性看待国内大热的HuTool工具包
  3. this关键字在JAVA和JS中的异同
  4. 1.5.5 HDFS读写解析-hadoop-最全最完整的保姆级的java大数据学习资料
  5. forms组件源码剖析
  6. Django连接数据库(mysql)与Django ORM实操(增删改查) 前端页面
  7. SQLMap入门——获取字段内容
  8. Python面试常见算法题集锦(递归部分)
  9. 【WPF】自定义一个自删除的多功能ListBox
  10. 【带你读论文】向量表征经典之DeepWalk