题意:

求解$\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 ;
}

最新文章

  1. MySQL数据库和InnoDB存储引擎文件
  2. ABP框架 - 多层结构
  3. 缩放因子和UI设计
  4. 策划了个.NET控件的案例大赛
  5. Orchard使用中的坎坎坷坷
  6. WampServer 给电脑搭建apache服务器和php环境
  7. Socket异步发送的同步控制
  8. $.post()返回数据正常,但不执行success回调函数
  9. Razor Generator 将cshtml自动生成对应的CS文件
  10. label 和 legend标签的用法
  11. 科尔尼咨询公司 - MBA智库百科
  12. LeetCode OJ 122. Best Time to Buy and Sell Stock II
  13. R语言基础1
  14. 如何在CentOS上创建Kubernetes集群
  15. 分享一个在线生成微信跳转链接实现微信内跳转浏览器打开URL的工具
  16. Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题
  17. 参考RPC
  18. 数据库基础SQL知识面试题一
  19. JS中如何判断对象是对象还是数组
  20. jQuery中.html(“xxx”)和.append(&quot;xxx&quot;) 的区别

热门文章

  1. angular 关于 factory、service、provider的相关用法
  2. 启动app-inspector报Internal Server Error
  3. java线程中断[interrupt()函数] (转载)
  4. 透视WPF 应用程序的利器
  5. 查看客户端java日志
  6. WWDC2014 IOS8 APP Extensions
  7. 针对Web.config敏感信息加密
  8. Nothing but the key 属性全部依赖于主键 third norm form
  9. jstat监控gc情况
  10. 快速上手Ubuntu之安装篇——安装win7,Ubuntu16.04双系统【转】