题目链接


\(Description\)

求$$\sum_{i=1}n\sum_{j=1}i\frac{lcm(i,j)}{gcd(i,j)}$$

答案对\(10^9+7\)取模。

\(n<=10^9\)


\(Solution\)

以前做的反演题都是\(j\)枚举到\(n\),但是现在\(j\)只枚举到\(i\)就非常难受,考虑怎么求\(\sum_{i=1}^n\sum_{j=1}^n\frac{lcm(i,j)}{gcd(i,j)}\)。

可以把它看成是一个\(n*n\)的网格,第\(i\)行第\(j\)列上的数是\(\frac{lcm(i,j)}{gcd(i,j)}\),需要我们求的是包括对角线在内的下三角矩阵的权值和。

所以答案为(所有网格权值之和+对角线上的权值和)/2。

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

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

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

考虑怎么求后半部分

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

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

枚举\(d\)

\[=\sum_{d=1}^n\mu_d\sum_{d|i}^n\sum_{d|j}^nij
\]

\[=\sum_{d=1}^n\mu_dd^2\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij
\]

令\(sum(n)=\sum_{i=1}^ni\),

所以原式

\[=\sum_{i=1}^n\mu_ii^2sum(n/i)^2
\]

带回到一开始的式子里去

\[\sum_{d=1}^n\sum_{i=1}^{n/d}\mu_ii^2sum(\frac{n}{id})^2
\]

按照套路令\(T=id\)

\[=\sum_{T=1}^nsum(n/T)^2\sum_{d|T}\mu_dd^2
\]

令\(f(x)=\sum_{d|x}\mu_dd^2\),现在如果我们可以快速的求出\(f(x)\)的前缀和,那么就可以数论分块算答案了。

可是\(f(x)\)并不是一个熟悉的数论函数,怎么才能用杜教筛呢?

可以把\(f(x)\)写成几个函数的卷积的形式。

令\(g(x)=\mu_xx^2\)。那么\(f=g*1\)。现在要找一个函数\(h\)使得\(f*h=g*1*h\)好算。我们知道\(\sum_{d|x}\mu_d=e\),所以令\(h(x)=x^2\)来把\(g(x)中的乘x^2\)消掉。

所以就构造出了\(s=f*h=g*1*h=e*1=1\),不难发现\(f\)是个积性函数,可以线筛。

#include<complex>
#include<cstdio>
#include<map>
using namespace std;
const int mod=1e9+7;
const int N=2e6+7;
int n,tot,inv2=mod+1>>1,inv6=166666668;
int prime[N],mu[N],f[N];
bool check[N];
map<int,int>mp;
int qread()
{
int x=0;
char ch=getchar();
while(ch<'0' || ch>'9')ch=getchar();
while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
void Init()
{
int nn=min(n,N-1);
check[1]=f[1]=1;
for(int i=2;i<=nn;i++)
{
if(!check[i])prime[++tot]=i,f[i]=1-1ll*i*i%mod;
for(int j=1;j<=tot && i*prime[j]<=nn;j++)
{
check[i*prime[j]]=1;
if(i%prime[j])f[i*prime[j]]=1ll*f[i]*f[prime[j]]%mod;
else
{
f[i*prime[j]]=f[i];
break;
}
}
}
for(int i=1;i<=nn;i++)
f[i]=(f[i-1]+f[i])%mod;
}
int Calc1(int x)
{
long long res=1ll*x*(x+1)/2%mod;
return res*res%mod;
}
int Calc2(int x)
{
return 1ll*x*(x+1)%mod*(x+x+1)%mod*inv6%mod;
}
int Sum(int x)
{
if(x<N)return f[x];
if(mp[x])return mp[x];
long long res=x;
for(int l=2,r;l<=x;l=r+1)
{
r=x/(x/l);
res=(res-1ll*(Calc2(r)-Calc2(l-1)+mod)*Sum(x/l))%mod;
}
return mp[x]=(res+mod)%mod;
}
int main()
{
scanf("%d",&n);
Init();
long long ans=0;
for(int l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=(ans+1ll*Calc1(n/l)*(Sum(r)-Sum(l-1)))%mod;
}
printf("%d\n",1ll*(ans+n+mod)*inv2%mod);
return 0;
}

LOJ#6229. 这是一道简单的数学题(莫比乌斯反演+杜教筛)的更多相关文章

  1. 「洛谷P3768」简单的数学题 莫比乌斯反演+杜教筛

    题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\]  ...

  2. luogu 3768 简单的数学题 (莫比乌斯反演+杜教筛)

    题目大意:略 洛谷传送门 杜教筛入门题? 以下都是常规套路的变形,不再过多解释 $\sum\limits_{i=1}^{N}\sum\limits_{j=1}^{N}ijgcd(i,j)$ $\sum ...

  3. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  4. loj#6229 这是一道简单的数学题

    \(\color{#0066ff}{ 题目描述 }\) 这是一道非常简单的数学题. 最近 LzyRapxLzyRapx 正在看 mathematics for computer science 这本书 ...

  5. loj#6229. 这是一道简单的数学题 (??反演+杜教筛)

    题目链接 题意:给定\(n\le 10^9\),求:\(F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)} ...

  6. 洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】

    题目描述 求 \[\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} i*j*gcd(i,j) \pmod{p}\] \(n<=10^{10}\),\(p\) ...

  7. LOJ#6491. zrq 学反演(莫比乌斯反演 杜教筛)

    题意 题目链接 Sol 反演套路题? 不过最后一步还是挺妙的. 套路枚举\(d\),化简可以得到 \[\sum_{T = 1}^m (\frac{M}{T})^n \sum_{d \ | T} d \ ...

  8. EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

  9. 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛

    题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...

随机推荐

  1. 解决Linq Join Group by 时报错:Nullable object must have a value.

    Linq Join Group by 时报Nullable object must have a value. 例如: from s in subject on ch.SubId equals s.S ...

  2. C语言----循环结构1(基础篇五)

    今天更新一个C语言的循环,简单点就是就是我们平时在使用电脑时不停的刷新网页,生活中每天都要吃饭等等就是循环,而编程中也有不断循环的过程,或者遇到符合的条件结束循环 下面进入今天的主题: 需求:用计算机 ...

  3. Vue--基础2

    目录 Vue--基础2 vue成员获取 分隔符成员 计算属性成员 什么是计算属性 计算属性的用法 注意: 监听属性成员 组件 组件的介绍 组件的优点: 局部组件 全局组件 组件复用的数据隔离 组件之间 ...

  4. Date+闭包

    date类: var  time=new.date() get date() 返回一个月中的某一天 get day () 返回一周中的某一天 get fullyear() 对象以四位数返回年份 get ...

  5. Xcode11 Developer Tool中没了Application Loader

    升级Xcode11之后不少人发现在Open Developer Tool中没了Application Loader. 那么如果我们还想用该怎么办呢? 先这样 找个老版的Xcode–>Conten ...

  6. echarts的最外层配置项

    每次查echarts的官网上边的配置项不知道分别代表什么,必须点开才知道,所以在这做下Echarts配置项的简单记录 最外层的配置项: title:进行标题与副标题的显示隐藏,位置,字体颜色,字体大小 ...

  7. Android-----ListView组件使用(实现点击选择)

    在Android中的ListView选单组件,是以下列表方式来列出选项,供用户选择. ListView组件属性设置: 创建spinner组件时,只需要设置一项entries属性即可使用.此属性是设置要 ...

  8. 05-Vue组件

    定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不同: ...

  9. 创建简易的SpringBoot项目

    创建简易的SpringBoot项目 这两天在学习springboot,菜鸟刚刚知道这个东西,看着springboot项目下那一大堆目录都不知道从何下手,还是静下心来从最简单的创建一个项目入手,这路和大 ...

  10. Golang: 模拟搜索引擎爬虫

    最近网站需要针对百度做 SEO 优化,用 Go 语言写了个测试程序,模拟一下百度的爬虫,看看返回的内容是否正确. 代码很简单,就是发送一个请求,把百度相关的信息放入请求头中即可,代码如下: packa ...