题目描述

  设\(n=\prod a_i^{p_i}\),那么定义\(f_d(n)=\prod{(-1)^{p_i}[p_i\leq d]}\)。特别的,\(f_1(n)=\mu(n)\)。

  给你\(n,k\),求

\[\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^kf_d(\gcd(i,j))
\]

  \(n\leq {10}^{10},k\leq 40\)

题解

  先做一些简单的处理

\[\begin{align}
ans&=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^kf_d(\gcd(i,j))\\
&=\sum_{i=1}^n\sum_{d=1}^kf_d(i)(2(\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor}\varphi(j))-1)
\end{align}
\]

  后面\(\varphi\)用杜教筛可以在\(O(n^\frac{2}{3})\)内搞出来。

  设\(\lambda(n)=f_\infty(n)=\prod{(-1)}^{p_i}\)

  考虑容斥,有:

\[f_d(n)=\lambda(n)\sum_{i^d|n}\mu(i)
\]

\[\begin{align}
F_d(n)&=\sum_{i=1}^nf_d(i)\\
&=\sum_{i=1}^n\lambda(i)\sum_{j^d|i}\mu(j)\\
&=\sum_{i=1}^n\mu(i)\sum_{j=1}^{\lfloor\frac{n}{i^{d+1}}\rfloor}\lambda(i^{d+1}j)\\
&=\sum_{i=1}^{\lfloor\sqrt[d+1]{n}\rfloor}\lambda^{d+1}(i)\mu(i)\Lambda(\lfloor\frac{n}{i^{d+1}}\rfloor)
\end{align}
\]

  \(n\leq {10}^7\)的部分预处理,其他的每次枚举。这部分每次枚举是\(\sqrt{n}\)的。总的是\(O(n^\frac{2}{3})\)的。(和杜教筛的分析方法一样。)

\[\begin{align}
\sum_{j|i}\lambda(j)&=[i是完全平方数]\\
\sum_{i=1}^n\sum_{j|i}\lambda(j)&=\sqrt{n}\\
\sqrt{n}=\sum_{i=1}^n\sum_{j}[j|i]\lambda(i)&=\sum_{\frac{i}{j}=1}^n\sum_{j=1}^{\lfloor\frac{n}{\frac{i}{j}}\rfloor}\lambda(j)
=\sum_{i=1}^n\Lambda(\lfloor\frac{n}{i}\rfloor)\\
\Lambda(n)&=\sqrt {n}-\sum_{i=2}^n\Lambda(\lfloor\frac{n}{i}\rfloor)
\end{align}
\]

  后面\(\Lambda(n)\)用杜教筛可以在\(O(n^\frac{2}{3})\)内搞出来

  反正总的是\(O(n^\frac{2}{3})\)的就对了。。。

  时间复杂度:\(O(n^\frac{2}{3})\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int getsqrt(ll n)
{
int l=1,r=1000000;
while(l<r)
{
int mid=(l+r+1)>>1;
if((ll)mid*mid>n)
r=mid-1;
else
l=mid;
}
return l;
}
ll n;
ll _sqrt;
namespace hashset
{
int getnum(ll x)
{
return n/x;
}
}
using hashset::getnum;
int miu[10000010];
int phi[10000010];
int c[10000010];
int cs[10000010];
const int maxn=10000000;
int b[10000010];
int pri[1000010];
int cnt;
int d[10000010];
int e[10000010];
int f[10000010];
int k;
int vis[10000010];
int qp[10000010];
int qc[10000010];
void init()
{
c[1]=phi[1]=miu[1]=f[1]=e[1]=1;
d[1]=f[1]=0;
int i,j;
for(i=2;i<=maxn;i++)
{
if(!b[i])
{
miu[i]=-1;
phi[i]=i-1;
c[i]=-1;
pri[++cnt]=i;
d[i]=e[i]=1;
f[i]=1;
}
for(j=1;j<=cnt&&i*pri[j]<=maxn;j++)
{
b[i*pri[j]]=1;
c[i*pri[j]]=-c[i];
f[i*pri[j]]=f[i]+1;
if(i%pri[j]==0)
{
miu[i*pri[j]]=0;
phi[i*pri[j]]=phi[i]*pri[j];
d[i*pri[j]]=d[i]+1;
e[i*pri[j]]=max(d[i*pri[j]],e[i]);
break;
}
d[i*pri[j]]=1;
e[i*pri[j]]=e[i];
miu[i*pri[j]]=-miu[i];
phi[i*pri[j]]=phi[i]*phi[pri[j]];
}
}
for(i=1;i<=maxn;i++)
{
if(e[i]>k)
f[i]=0;
else
f[i]=(f[i]&1?-1:1)*(k-e[i]+1);
f[i]+=f[i-1];
// miu[i]+=miu[i-1];
phi[i]+=phi[i-1];
cs[i]=cs[i-1]+c[i];
}
}
int getphi(ll n)
{
if(n<=maxn)
return phi[n];
int x=getnum(n);
if(vis[x]&1)
return qp[x];
vis[x]|=1;
ll i,j;
int s=n*(n+1)>>1;
for(i=2;i<=n;i=j+1)
{
j=n/(n/i);
s-=(j-i+1)*getphi(n/i);
}
qp[x]=s;
return s;
}
int getc(ll n)
{
if(n<=maxn)
return cs[n];
int x=getnum(n);
if(vis[x]&2)
return qc[x];
vis[x]|=2;
int s=getsqrt(n);
ll i,j;
for(i=2;i<=n;i=j+1)
{
j=n/(n/i);
s-=(j-i+1)*getc(n/i);
}
qc[x]=s;
return s;
}
ll pw[1000010];
int pw2[1000010];
int pw3[1000010];
int getfd(ll n)
{
if(n<=maxn)
return f[n];
int i,j;
for(i=1;(ll)i*i<=n;i++)
{
pw[i]=i;
pw2[i]=pw3[i]=c[i];
}
int m=i-1;
int s=0;
for(j=1;j<=k;j++)
{
for(i=1;i<=m;i++)
{
pw[i]*=i;
if(pw[i]>n)
break;
pw2[i]*=pw3[i];
s+=miu[i]*pw2[i]*getc(n/pw[i]);
}
}
return s;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
scanf("%lld%d",&n,&k);
_sqrt=getsqrt(n);
init();
int s=0;
ll i,j;
int now,last=0;
int ans=0;
for(i=1;i<=n;i=j+1)
{
j=n/(n/i);
now=getfd(j);
ans+=(now-last)*(2*getphi(n/i)-1);
last=now;
}
ans&=(1<<30)-1;
printf("%d\n",ans);
return 0;
}

【XSY2721】求和 杜教筛的更多相关文章

  1. BZOJ4805: 欧拉函数求和(杜教筛)

    4805: 欧拉函数求和 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 614  Solved: 342[Submit][Status][Discus ...

  2. BZOJ 4805: 欧拉函数求和 杜教筛

    https://www.lydsy.com/JudgeOnline/problem.php?id=4805 给出一个数字N,求sigma(phi(i)),1<=i<=N https://b ...

  3. 【bzoj3944/bzoj4805】Sum/欧拉函数求和 杜教筛

    bzoj3944 题目描述 输入 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 输出 一共T行,每行两个用空格分隔的数ans1,ans2 样例输 ...

  4. 【BZOJ3944/4805】Sum/欧拉函数求和 杜教筛

    [BZOJ3944]Sum Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用 ...

  5. 【BZOJ4805】欧拉函数求和(杜教筛)

    [BZOJ4805]欧拉函数求和(杜教筛) 题面 BZOJ 题解 好久没写过了 正好看见了顺手切一下 令\[S(n)=\sum_{i=1}^n\varphi(i)\] 设存在的某个积性函数\(g(x) ...

  6. 【LOJ#572】Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛)

    [LOJ#572]Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛) 题面 LOJ \[ans=\sum_{i=1}^n\sum_{j=1}^n f(gcd(i,j))^k\ ...

  7. 【XSY2754】求和 莫比乌斯反演 杜教筛

    题目描述 给你\(n,p\),求 \[ \sum_{i=1}^n\sum_{j=1}^i\sum_{k=1}^i\gcd(i,j,k)\mod p \] \(n\leq {10}^9\) 题解 \[ ...

  8. LOJ# 572. 「LibreOJ Round #11」Misaka Network 与求和(min25筛,杜教筛,莫比乌斯反演)

    题意 求 \[ \sum_{i = 1}^{n} \sum_{i = 1}^{n} f(\gcd(i, j))^k \pmod {2^{32}} \] 其中 \(f(x)\) 为 \(x\) 的次大质 ...

  9. LOJ572. 「LibreOJ Round #11」Misaka Network 与求和 [莫比乌斯反演,杜教筛,min_25筛]

    传送门 思路 (以下令\(F(n)=f(n)^k\)) 首先肯定要莫比乌斯反演,那么可以推出: \[ ans=\sum_{T=1}^n \lfloor\frac n T\rfloor^2\sum_{d ...

随机推荐

  1. Mysql安装(Ubuntu)

    卸载方法一: --删除mysql的数据文件 sudo rm /var/lib/MySQL/ -R --删除mysql的配置文件 sudo rm /etc/mysql/ -R --自动卸载mysql(包 ...

  2. Python-类的继承与派生

    python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1( ...

  3. vue组件化开发组件拆分原则是什么

    原则:可复用.可组合: 两大类:页面组件.功能组件: 除了公共头导航.侧导航.脚部内容,还有:

  4. 1060D Social Circles(贪心)

    题意:有n个客人,第i个客人希望左边至少Li个空椅子,右边至少Ri个空椅子,每个客人都属于一个圈,问你最少需要准备的椅子数量 贪心做,每个人都可以去和另一个人牵手,组成一个新的人,那么我们让大的和大的 ...

  5. 软工网络15团队作业8——Beta阶段敏捷冲刺

    Deadline: 2018-5-31 22:00PM,以博客提交至班级博客时间为准 根据以下要求: (1)在敏捷冲刺前发布一篇博客,作为beta版敏捷冲刺的开始, (2)同时,团队在日期区间[5.2 ...

  6. Docker Compose vs. Dockerfile

    Docker Compose vs. Dockerfile - which is better? - Stack Overflowhttps://stackoverflow.com/questions ...

  7. [转帖]Windows注册表内容详解

    Windows注册表内容详解 来源:http://blog.sina.com.cn/s/blog_4d41e2690100q33v.html 对 windows注册表一知半解 不是很清晰 这里学习一下 ...

  8. ORA-28000: the account is locked解决办法

    ORA-28000: the account is locked第一步:使用PL/SQL,登录名为system,数据库名称不变,选择类型的时候把Normal修改为Sysdba;第二步:选择myjob, ...

  9. 小程序获取当前页面URL

    var pages = getCurrentPages() //获取加载的页面 var currentPage = pages[pages.length-1] //获取当前页面的对象 var url ...

  10. Hadoop2.0 Namenode HA实现方案

    Hadoop2.0 Namenode HA实现方案介绍及汇总 基于社区最新release的Hadoop2.2.0版本,调研了hadoop HA方面的内容.hadoop2.0主要的新特性(Hadoop2 ...