求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$
 
考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$
 
$\Rightarrow \sum_{i=1}^{n}\sum_{j=1}^{n}ij\sum_{d|gcd(i,j)}\varphi(d)$
 
$\Rightarrow \sum_{i=1}^{n}\sum_{j=1}^{n}ij\sum_{d|i,d|j}\varphi(d)$
 
$\Rightarrow \sum_{d=1}^{n}\varphi(d)\sum_{d|i}\sum_{d|j}ij$
 
$\Rightarrow\sum_{d=1}^{n} \varphi(d)d^2\sum_{i=1}^{\frac{n}{d}}i\sum_{j=1}^{\frac{n}{d}}j$
 
对于 $\sum_{i=1}^{\frac{n}{d}}i\sum_{j=1}^{\frac{n}{d}}j$,直接 $O(1)$求
 
令 $calc(n,m)=\frac{n(n+1)}{2}\times \frac{m(m+1)}{2}$
 
将 $\frac{n}{d}$ 带入即可.
 
原式可化为 $\sum_{d=1}^{n} \varphi(d)d^2\times calc(\frac{n}{d},\frac{n}{d})$
 
这个复杂度是 $O(\sqrt n)$ 的.
 
然而,有一个问题:我们正常只能求出 $[1,1e7]$ 的欧拉函数值.
 
于是,要用杜教筛优化一下.
 
令 $f(x)=\varphi(x)x^2$
 
搬出杜教是公式: $S(n)=\frac{\sum_{i=1}^{n}(f*g)(i)-\sum_{i=2}^{n}g(i)S(\frac{n}{i})}{g(1)}$
 
$f(x)$ 是固定的,现在只需选一个合适的 $g(x)$,使得可以快速算出 $\sum_{i=1}^{n}(f*g)(i)$
 
$(f*g)(i)=\sum_{d|i}f(d)g(\frac{i}{d})$
 
$\Rightarrow \sum_{d|i}\varphi(d)d^2g(\frac{i}{d})$
 
$d^2$ 有点讨厌,要是能消掉就好了.
 
令 $g(x)=x^2$
 
$\Rightarrow \sum_{d|i}\varphi(d)d^2(\frac{i}{d})^2$
 
$\Rightarrow \sum_{d|i}\varphi(d)i^2$
 
$\Rightarrow i^2\times\sum_{d|i}\varphi(d)$ 
 
$\Rightarrow i^3$    
 
将 $(f*g)(i)$ 的结果带入杜教筛公式中.
 
即当 $f(x)=\varphi(x)x^2$, $g(x)=x^2$ 时,
 
$S(n)=\sum_{i=1}^{n}i^3-\sum_{i=2}^{n}i^2\times S(\frac{n}{i})$
 
搬出高中数学公式:
 
$\sum_{i=1}^{n}i^2=\frac{n(n+1)(2n+1)}{6}$
 
$\sum_{i=1}^{n}i^3=\frac{n^2(n+1)^2}{4}$
 
回到原式 $\sum_{d=1}^{n} \varphi(d)d^2\times calc(\frac{n}{d},\frac{n}{d})$
 
直接用杜教筛算 $\varphi(d)d^2$ 的前缀和并用整除分块算出结果即可. 
#include<bits/stdc++.h>
#define maxn 10200006
#define ll long long
#define M 10000007
using namespace std;
int cnt;
ll sumv[maxn], rev4, rev6, mod, rev2;
bool vis[maxn];
ll phi[maxn], prime[maxn];
map<ll,ll>ansphi;
void setIO(string s)
{
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
ll qpow(ll base, ll k)
{
ll tmp=1;
while(k)
{
if(k&1) tmp=tmp*base%mod;
base=base*base%mod;
k>>=1;
}
return tmp;
}
void init()
{
int i,j;
rev4=qpow(4ll, mod-2), rev6=qpow(6ll, mod-2), rev2=qpow(2ll, mod-2);
phi[1]=1;
for(i=2;i<=M;++i)
{
if(!vis[i]) prime[++cnt]=i, phi[i]=i-1;
for(j=1;j<=cnt&&1ll*i*prime[j]<=M;++j)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for(i=1;i<=M;++i) sumv[i]=(sumv[i-1]+(1ll*phi[i]*i%mod*i%mod))%mod;
}
// 平方
ll cal1(ll i)
{
i%=mod;
ll re=i%mod;
re=re*(i+1)%mod;
re=re*(i+i+1)%mod;
re=(re*rev6)%mod;
return re;
}
// 立方
ll cal2(ll i)
{
i%=mod;
ll re=i%mod;
re=(re*i)%mod;
re=(re*(i+1))%mod;
re=re*(i+1)%mod;
re=(re*rev4)%mod;
return re;
}
ll get(ll n)
{
if(n<=M) return sumv[n];
if(ansphi[n]) return ansphi[n];
ll i,j,re=cal2(n),tmp;
for(i=2;i<=n;i=j+1)
{
j=n/(n/i);
tmp=(cal1(j)-cal1(i-1)+mod)%mod;
tmp=(tmp*get(n/i))%mod;
re=(re-tmp+mod)%mod;
}
return ansphi[n]=re;
}
ll calc(ll n)
{
n%=mod;
return (((n*(n+1))%mod)*(rev2%mod))%mod ;
}
int main()
{
// setIO("input");
ll n,i,j,re=0,tmp=0;
scanf("%lld%lld",&mod,&n);
init();
for(i=1;i<=n;i=j+1)
{
j=n/(n/i);
tmp=(calc(n/i)*calc(n/i)%mod*(get(j)-get(i-1)+mod)%mod)%mod;
re=(re+tmp+mod)%mod;
}
printf("%lld\n",re);
return 0;
}

  

luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元的更多相关文章

  1. P3768 简单的数学题 [杜教筛,莫比乌斯反演]

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

  2. P3768 简单的数学题 杜教筛+推式子

    \(\color{#0066ff}{ 题目描述 }\) 由于出题人懒得写背景了,题目还是简单一点好. 输入一个整数n和一个整数p,你需要求出(\(\sum_{i=1}^n\sum_{j=1}^n ij ...

  3. [luogu3768] 简单的数学题 [杜教筛]

    题面: 传送门 实际上就是求: 思路: 看到gcd就先反演一下,过程大概是这样: 明显的一步反演 这里设,S(x)等于1到x的和 然后把枚举d再枚举T变成先枚举T再枚举其约数d,变形: 后面其中两项展 ...

  4. 51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)

    题目链接 \(Description\) \(n\leq 10^{10}\),求 \[\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\ mod\ (1e9+7)\] \(Soluti ...

  5. 2019年南京网络赛E题K Sum(莫比乌斯反演+杜教筛+欧拉降幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 首先我们将原式化简: \[ \begin{aligned} &\sum\limits_{l_1=1}^{n}\sum\limits_{l_2 ...

  6. Luogu P3768 简单的数学题

    非常恶心的一道数学题,推式子推到吐血. 光是\(\gcd\)求和我还是会的,但是多了个\(ij\)是什么鬼东西. \[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)=\sum_ ...

  7. Luogu 4213 【模板】杜教筛(Sum)

    当作杜教筛的笔记吧. 杜教筛 要求一个积性函数$f(i)$的前缀和,现在这个东西并不是很好算,那么我们考虑让它卷上另外一个积性函数$g(i)$,使$(f * g)$的前缀和变得方便计算,然后再反推出这 ...

  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. bzoj 4176: Lucas的数论 -- 杜教筛,莫比乌斯反演

    4176: Lucas的数论 Time Limit: 30 Sec  Memory Limit: 256 MB Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么 ...

随机推荐

  1. mysql定时备份shell脚本

    #!/bin/bash #每天早上4点, mysql备份数据 # backup.sh #crontab -e # * * * /home/erya/run/moniter/mysql_backup.s ...

  2. 设计模式 - 门面模式(Facade Pattern,也叫外观模式)

    简介 场景 将系统划分为若干个子系统有利于降低系统的复杂性,但是这会增加调用者的复杂性.通过引入 Facade 可以对调用者屏蔽系统内部子系统的细节. Java 中有多个日志库,例如 log4j.lo ...

  3. WPF数据模板中绑定事件不触发问题

    今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定 ...

  4. 【FICO系列】SAP 创建会计凭证(FB01)的BAPI

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[FICO系列]SAP 创建会计凭证(FB01) ...

  5. 【SD系列】SAP SD模块-创建供应商主数据BAPI

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP SD模块-创建供应商主数据B ...

  6. Visual Studio Code配置技巧

    Visual Studio Code配置技巧 VS Code是啥 Visual Studio Code(以下简称 VS Code) 是一个免费.开源.跨平台的由微软开发的程序编辑器.它是用 TypeS ...

  7. Docker 换源

    近几天又折腾起 docker来了    我发现自己在拉镜像的时候,总是超时    然后百度了一下  说要换源 90sec的一个水友 推荐了我 阿里云的加速源    我看了还是免费就想试一下 讲一下过程 ...

  8. Collections -集合排序compareTo方法重写,shuffle,addall

    package cn.learn.collection.Collections; /* 排序的对象的类,实现comparable借口,重写compareto方法 若要打印必须重写toString方法, ...

  9. Linux命令行基础操作

    目录 1.打开终端命令行 2.常用快捷键 2.1 tab键 2.2 Ctrl+c组合键 2.3 Ctrl+d组合键 2.4Ctrl+Shift+c组合键和Ctrl+Shift+v组合键 2.5图形界面 ...

  10. MySQL-第五篇视图

    1.视图看上去像是表,但它又不是,它并不能存储数据.视图只是一个或者多个表的逻辑显示.使用视图的好处: 1>可以限制对数据的访问 2>可以使复杂的查询变得简单 3>提供了数据的独立性 ...