求 $\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. pycharm项目代码上传远程centos服务器

    pycharm项目代码上传远程centos服务器 在工作中,我们经常会遇到如下情况,在windows系统下的pycharm中开发项目,但是需要在linux服务器上部署和运行我们的项目.那么我们的项目是 ...

  2. 【经验分享】 解决CentOS7 安装VMTools提示找不到Kernel头文件的方案

    配置一个Linux的开发环境,用VM10+CentOS7(Kernel版本3.10.0-327.10.1.el7),之后发现VMTools功能不全,查证后发现需要卸载重装,于是开始折腾. 按照各种说明 ...

  3. 第 3 章 前端基础之JavaScript

    一.JavaScript概述 1.javascripts的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptE ...

  4. Git使用gitignore建立项目过滤规则

    在进行协作开发代码管理的过程中,常常会遇到某些临时文件.配置文件.或者生成文件等,这些文件由于不同的开发端会不一样,如果使用git add . 将所有文件纳入git库中,那么会出现频繁的改动和push ...

  5. 【SD系列】SAP SD模块-销售收入科目的配置

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP SD模块-销售收入科目的配置 ...

  6. WildFly的学习

    1. WildFly介绍: WildFly,前身是JBoss AS,从V8开始为区别于JBoss EAP,更名为WildFly. 由红帽 (Red Hat)开发,是另一个功能齐全且经过认证的应用服务器 ...

  7. 远程操作 SQl server2008新建角色和数据库

    远程操作 SQl server2008 1.windows身份登录,安全性-->登录名(右键)-->新建登录名:yc ,密码111111-->点选sql server身份验证--&g ...

  8. 20190821 On Java8 第十一章 内部类

    第十一章 内部类 一个定义在另一个类中的类,叫作内部类. 链接外部类 内部类是一种名字隐藏和组织代码的模式. 内部类拥有其外围类的所有元素的访问权. 内部类 .this 和 .new的使用 this: ...

  9. c语言1博客作业12-学期总结

    一.我学到的内容 二.收获总结 2.1我的收获 链接: c语言1博客作业01:https://www.cnblogs.com/dy-985211/p/11578914.html c语言1博客作业02: ...

  10. Windows下Nginx的启动、停止、重启等命令

    Windows下Nginx的启动.停止等命令 在Windows下使用Nginx,我们需要掌握一些基本的操作命令,比如:启动.停止Nginx服务,重新载入Nginx等,下面我就进行一些简单的介绍. 假设 ...