Mertens
题意:
求解$\sum_{i=a}^b{\mu(i)}$。
解法:
由$(\mu * I)(n) = e(n)$ 得 $\sum_{d|n}{\mu(d)} = [n=1]$ 得 $\mu(n) = \sum_{d|n,d<n}{\mu(d)}$
从而有$$\sum_{i=1}^n{\mu(i)} = 1 - \sum_{i=1}^n{ \sum_{d|i,d<i}{\mu(d)} }$$
$$=1-\sum_{t=2}^n{ \sum_{d=1}^{[\frac{n}{t}]}{\mu(d)} }$$
记$S(n) = \sum_{i=1}^n{\mu(i)}$
从而有$S(n) = 1- \sum_{t=2}^n{S([\frac{n}{t}])}$
考虑分块优化此式,产生$O(\sqrt n)$的时间复杂度,当n小于等于$n^{0.6667}$时直接应用线性筛计算。
分析得会产生$O(n^{0.667})$个n,从而应用map,递归计算即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <map> #define LL long long
#define LIM 5000000 using namespace std; int tot,prime[LIM+];
LL u[LIM+];
bool v[LIM+];
map<LL,LL> ansv; LL S(LL n)
{
if(n<=LIM) return u[n];
if(ansv.count(n)) return ansv[n];
LL j;
LL ans=;
for(LL i=;i<=n;i=j+)
{
j=n/(n/i);
ans -= (j-i+1LL) * S(n/i);
}
ansv[n]=ans;
return ans;
} int main()
{
// freopen("test.txt","r",stdin);
u[]=;
for(int i=;i<=LIM;i++)
{
if(!v[i])
{
prime[++tot]=i;
u[i]=-;
}
for(int j=;i*prime[j]<=LIM;j++)
{
v[i*prime[j]]=;
u[i*prime[j]]=u[i]*u[prime[j]];
if(i%prime[j]==)
{
u[i*prime[j]]=;
break;
}
}
}
for(int i=;i<=LIM;i++) u[i]+=u[i-];
LL a,b;
cin >> a >> b;
cout << S(b)-S(a-) << endl;
return ;
}
同样的方法,由$(\phi * I)(n) = id(n)$得到
$S(n) = \frac{n(n+1)}{2} - \sum_{t=2}^n{S([\frac{n}{t}])}$
注意n*(n+1)可能炸long long。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <map>
#include <cassert> #define LL long long
#define LIM 5000000
#define P 1000000007LL using namespace std; int tot,prime[LIM+];
LL phi[LIM+],inv2;
bool v[LIM+];
map<LL,LL> ansv; LL S(LL n)
{
if(n<=LIM) return phi[n];
if(ansv.count(n)) return ansv[n];
LL j;
LL ans=n%P * (n%P + 1LL) %P * inv2%P;
assert(ans >=);
for(LL i=;i<=n;i=j+)
{
j=n/(n/i);
ans += P - ((j-i+1LL) * S(n/i)%P);
if(ans>=P) ans -= P;
}
ansv[n]=ans;
return ans;
} LL qpow(LL x,int n)
{
LL ans=;
for(;n;n>>=,x=x*x%P) if(n&) ans=ans*x%P;
return ans;
} int main()
{
// freopen("test.txt","r",stdin);
phi[]=;
for(int i=;i<=LIM;i++)
{
if(!v[i])
{
prime[++tot]=i;
phi[i]=i-;
}
for(int j=;i*prime[j]<=LIM;j++)
{
v[i*prime[j]]=;
phi[i*prime[j]]=phi[i]*phi[prime[j]];
if(i%prime[j]==)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
}
}
inv2=qpow(,P-);
for(int i=;i<=LIM;i++)
{
phi[i]=phi[i]+phi[i-];
if(phi[i]>=P) phi[i] -= P;
}
LL n;
cin >> n;
cout << S(n) << endl;
return ;
}
Mertens的更多相关文章
- 51nod 1244 莫比乌斯函数之和
题目链接:51nod 1244 莫比乌斯函数之和 题解参考syh学长的博客:http://www.cnblogs.com/AOQNRMGYXLMV/p/4932537.html %%% 关于这一类求积 ...
- 分析一个嵌入payload的恶意.lnk文件
原文:https://isc.sans.edu/diary/Analyzis+of+a+Malicious+.lnk+File+with+an+Embedded+Payload/20763 We re ...
- 51nod1244 莫比乌斯函数之和
推公式.f[n]=1-∑f[n/i](i=2...n).然后递归+记忆化搜索.yyl说这叫杜教筛?时间复杂度貌似是O(n 2/3)的? #include<cstdio> #include& ...
- ### Paper about Event Detection
Paper about Event Detection. #@author: gr #@date: 2014-03-15 #@email: forgerui@gmail.com 看一些相关的论文. 1 ...
- 51nod1240莫比乌斯函数
莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号.(据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数). ...
- 51nod--1240莫比乌斯函数 (数论)
题目: 1240 莫比乌斯函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先 ...
- 51 Nod 1240 莫比乌斯函数
1240 莫比乌斯函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使 ...
- 51Nod 1240:莫比乌斯函数
1240 莫比乌斯函数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使 ...
- 使用开源软件 enfuse 做照片的曝光合成
使用开源软件 enfuse 做照片的曝光合成 所谓曝光合成就是对同一场景用不同的曝光量拍摄多张照片,然后将这些照片再合成为一张照片.之所以我们要这么做是因为现在的相机感光的动态范围相比人眼实在是太小了 ...
随机推荐
- 赵雅智_Android案例_刮刮乐
实现效果 主要代码 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...
- windows平台简易直播系统搭建
最近做直播系统的朋友很多,正好前端时间也在做这一块,写片文章分享下开发心得,以为后用. 直播系统我将它分为前堆推流,后台服务,客户端播放三大部分.前端推流基于ffmpeg,后台服务 使用crtmp服务 ...
- Mysql导出大量数据
outfile 导出文件 select name from t1 into outfile "/tmp/test.txt" infile 导入文件 导入到表t1中的name ...
- javacript中apply和call的区别
apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. 接受的参数是一个字符串. call:和apply的意思一样,只不过是参数列表不一样. 接收的参数是一个数组. 例如: <s ...
- 详谈kubernetes滚动更新-1
系列目录 这个系列分为两个小节,第一个小节介绍deployment滚动更新时,deployment.replicaset.pod的细节以及创建过程以及deployment版本管理的方式 第二个小节将介 ...
- Linux多线程编程的条件变量
在stackoverflow上看到一关于多线程条件变量的问题,题主问道:什么时候会用到条件变量,mutex还不够吗?有个叫slowjelj的人做了很好的回答,我再看这个哥们其他话题的一些回答,感觉水平 ...
- Hive调优实战
Hive是将符合SQL语法的字符串解析生成可以在Hadoop上执行的MapReduce的工具. 使用Hive尽量按照分布式计算的一些特点来设计sql,和传统关系型数据库有区别,所以需要去掉原有关系型数 ...
- 使用 lstat 函数获取文件信息
前言 在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记.但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等.如果要获取这些信息,则使用函数 lstat 可以轻松达到这个 ...
- compute the su procedure time with python
#!/usr/bin/python2.6 import re,datetime file_name='sim.log' file=open(file_name,'r') acnum=[];time_r ...
- oracle 日志归档设置
下面介绍下oracle的日志文档操作 归档日志作用:归档日志(Archive Log)是是处于非活动(INACTIVE)的状态的重做日志文件的备份,它对ORACLE数据库的备份和恢复起至关重要的作用. ...