Description

传送门

给一个整数\(n\),让你求

\[\sum\limits_{i=1}^n \sum\limits_{j=1}^n ij\gcd(i,j)
\]

对一个大质数\(p\)取模。

保证\(n \le 10^{10},5\times 10^{8} \le p \le 1.1 \times 10^9\),\(p\)为质数

Solutions

先来推柿子好了,枚举\(\gcd\)的取值,有

\[\begin{aligned}
Ans&=\sum\limits_{k} k\sum\limits_{i=1}^n\sum\limits_{j=1}^n ij[\gcd(i,j)=k] \\
&=\sum\limits_{k} k^3 \sum\limits_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{n}{k}\rfloor} ij[\gcd(i,j)=1]
\end{aligned}
\]

考虑求\(Sum(n)=\sum\limits_{i=1}^n\sum\limits_{j=1}^n ij[\gcd(i,j)=1]\)

推柿子

\[\begin{aligned}
Sum(n)&=\sum\limits_{i=1}^n\sum\limits_{j=1}^n ij\sum\limits_{d\mid \gcd(i,j)} \mu(d) \\
&= \sum\limits_{d} \mu(d) \sum\limits_{i=1}^{\lfloor n/d\rfloor}id\sum\limits_{j=1}^{\lfloor n/d\rfloor} jd \\
&= \sum\limits_{d} \mu(d)d^2 s(\lfloor\frac{n}{d}\rfloor)^2
\end{aligned}
\]

其中\(s(n)=1+2+\cdots+n=\frac{n(n+1)}{2}\)。

所以

\[\begin{aligned}
Ans&=\sum\limits_{k} k^3 Sum(\lfloor\frac{n}{k}\rfloor) \\
&=\sum\limits_{k} k^3 \sum\limits_{d} \mu(d)d^2 s(\lfloor\frac{\lfloor n/k\rfloor}{d}\rfloor) \\
&=\sum\limits_{k} k^3 \sum\limits_{d} \mu(d)d^2 s(\lfloor\frac{n}{kd}\rfloor)
\end{aligned}
\]

枚举\(T=kd\),有

\[\begin{aligned}
Ans&=\sum\limits_{T} s(\lfloor\frac{n}{T}\rfloor) \sum\limits_{d\mid T} \mu(d)d^2(\frac{T}{d})^3 \\
&=\sum\limits_{T} s(\lfloor\frac{n}{T}\rfloor)T^2\sum\limits_{d\mid T}\mu(d)\times \frac{T}{d}
\end{aligned}
\]

令\(f(n)=n^2\sum\limits_{d\mid n} \mu(d)\times \frac{n}{d}\),如果能快速求出\(f\)的前缀和的话我们对上面的柿子数论分块就好了。

观察到后面的和式是\(\mu\)与\(id\)的Dirichlet卷积的形式,假设

\[F(n)=\sum\limits_{d\mid n} \mu(d)\times \frac{n}{d}
\]

根据莫比乌斯反演的结论,必有

\[n=\sum\limits_{d\mid n} F(d)
\]

可以得到\(F(n)=\varphi(n)\),所以\(f(n)=n^2\varphi(n)\),我们想快速求出\(f\)的前缀和,\(n\le 10^{10}\),线筛又死了。

可以考虑杜教筛(djs?),令\(S(n)=\sum\limits_{i=1}^n f(i)\),我们想找到另一个积性函数\(g\),让\(f*g\)好看一点,我们知道欧拉函数有一个很美妙的性质\(\sum\limits_{d\mid n} \varphi(n)=n\),所以为了把\(f\)中的\(n^2\)消掉,配\(g(n)=n^2\)即可,有

\[h(n)=(f*g)(n)=\sum\limits_{d\mid n} f(d)g(\frac{n}{d})=\sum\limits_{d\mid n} n^2\varphi(d)
\]

即\(h(n)=n^2\sum\limits_{d\mid n} \varphi(n)=n^3\),

愉快的套柿子

\[S(n)=\sum\limits_{i=1}^n h(i)-\sum\limits_{i=2}^n g(i)S(\lfloor\frac{n}{i}\rfloor)=\sum\limits_{i=1}^n i^3-\sum\limits_{i=2}^n i^2S(\lfloor \frac{n}{i}\rfloor)
\]

用一点小学奥数的知识,我们知道\(1^3+2^3+\cdots+n^3=(1+2+\cdots+n)^2\),\(1^2+2^3+\cdots+n^2=\frac{n(n+1)(2n+1)}{6}\),所以

\[S(n)=s(n)^2-\sum\limits_{i=2}^n i^2S(\lfloor\frac{n}{i}\rfloor)
\]

后面的显然可以数论分块,于是处理\(f\)的前缀和的话杜教筛就好了。

再写一遍答案的柿子

\[Ans=\sum\limits_{T} s(\lfloor\frac{n}{T}\rfloor)f(T)
\]

对\(T\)数论分块+杜教筛就没了。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<(b);++i)
#define per(i,a,b) for (int i=(a)-1;i>=(b);--i)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
typedef double db;
typedef long long ll;
typedef pair<int,int> PII;
typedef vector<int> VI; const int maxn=5e6,N=maxn+10;
int mod,i2,i6;
inline int add(int x,int y) {return (x+=y)>=mod?x-mod:x;}
inline int sub(int x,int y) {return (x-=y)<0?x+mod:x;}
inline int normal(ll x) {return x<0?x+mod:x;}
inline int fpow(int x,int y) {
int ret=1; for(;y;y>>=1,x=1ll*x*x%mod)
if(y&1) ret=1ll*ret*x%mod;
return ret;
}
inline int sqr(int x) {return 1ll*x*x%mod;}
inline void initmod(int P) {
mod=P;
i2=fpow(2,mod-2),i6=fpow(6,mod-2);
} inline int ss1(ll n) {n%=mod;return 1ll*n*(n+1)%mod*i2%mod;}
inline int ss2(ll n) {n%=mod;return 1ll*n*(n+1)%mod*(2*n+1)%mod*i6%mod;}
inline int s1(ll l,ll r) {return sub(ss1(r),ss1(l-1));}
inline int s2(ll l,ll r) {return sub(ss2(r),ss2(l-1));} int p[N],pn,phi[N];
bool vis[N]; void sieve(int n) {
phi[1]=1;
rep(i,2,n+1) {
if(!vis[i]) {phi[i]=i-1;p[pn++]=i;}
for(int j=0;j<pn&&i*p[j]<=n;j++) {
vis[i*p[j]]=1;
if(i%p[j]==0) {phi[i*p[j]]=phi[i]*p[j];break;}
else phi[i*p[j]]=phi[i]*phi[p[j]];
}
}
rep(i,1,n+1) phi[i]=add(phi[i-1],1ll*i*i%mod*phi[i]%mod);
} map<ll,int> fsum;
int Sf(ll n) {
if(n<=maxn) return phi[n];
if(fsum.count(n)) return fsum[n];
int ans=sqr(ss1(n));
for(ll l=2,r=0;l<=n;l=r+1) {
r=n/(n/l);
ans=sub(ans,1ll*s2(l,r)*Sf(n/l)%mod);
}
return fsum[n]=ans;
} int main() {
#ifdef LOCAL
freopen("a.in","r",stdin);
#endif
int p; ll n; scanf("%d%lld",&p,&n);
initmod(p),sieve(maxn);
int ans=0;
for(ll l=1,r=0;l<=n;l=r+1) {
r=n/(n/l);
ans=add(ans,1ll*sub(Sf(r),Sf(l-1))*sqr(ss1(n/l))%mod);
}
printf("%d\n",ans);
return 0;
}

[题解] LuoguP3768 简单的数学题的更多相关文章

  1. luoguP3768 简单的数学题

    题目链接 luoguP3768 简单的数学题 题解 上面那个式子的最后一步,需要定理 用数学归纳法证明 \(S1=1^3=1^2\) \(S2=1^3+2^3=9=3^2=(1+2)^2\) \(S3 ...

  2. luoguP3768简单的数学题

    大佬们绕道吧(或跳到错误&启发后下一根横线后) 这道题吧正解是莫比乌斯反演吧,但本人有一种独创玄妙的想法去偏分 这道题是让我们求这个对吧 \((\sum_{i=1}^n\sum_{j=1}^n ...

  3. 【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

    [Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\( ...

  4. 【LG3768】简单的数学题

    [LG3768]简单的数学题 题面 求 \[ (\sum_{i=1}^n\sum_{j=1}^nij\text{gcd}(i,j))\text{mod}p \] 其中\(n\leq 10^{10},5 ...

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

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

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

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

  7. LG3768 简单的数学题

    P3768 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出$(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p$,其中gcd(a,b)表示a与b的最 ...

  8. 【数学】HPU--1037 一个简单的数学题

    1037: 一个简单的数学题 [数学] 时间限制: 1 Sec 内存限制: 128 MB提交: 259 解决: 41 统计 题目描述 小明想要知道$a^b$的值,但是这个值会非常的大. 所以退而求其次 ...

  9. 洛谷 P3768 简单的数学题 解题报告

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

随机推荐

  1. 记录5-如何在UltraEdit中编译和运行Java

    1点击“高级”,再点击“工具配置” 2点击“插入”,在“菜单项”名称上输入“编译java程序”,在“命令行”里输入“javac %n%e”,在工作目录上填“%p”. 3切换到“输出”项,选择“输出到列 ...

  2. 学习笔记(3)- BioASQ

    本次目的是验证BioBERT在QA的效果. A challenge on large-scale biomedical semantic indexing and question answering ...

  3. 原生JS 和 JQ 获取滚动条的高度,以及距离顶部的高度

    JQ:相对比较简便 获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度 ...

  4. Windows的本地时间(LocalTime)、系统时间(SystemTime)、格林威治时间(UTC-Time)、文件时间(FileTime)之间的转换

    今天处理了一个Bug,创建历史数据时脚本函数的起始时间不赋值或者赋0值时,计算引擎推给历史库的UTC时间为-288000000000,一开始以为是bug,经过分析后发现不赋值默认给起始时间赋0值,而此 ...

  5. Python爬虫教程-爬取5K分辨率超清唯美壁纸源码

    简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物.然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁 ...

  6. java连接sql server 2008

    请先确保已经设置好了sa,如果不是,可以参照下面链接修改http://jingyan.baidu.com/article/8cdccae9452b3c315513cd52.html 然后重启数据库,重 ...

  7. PAT乙级完结有感

    去年10月开始刷的题,拖拖拉拉的终于借这个假期刷完了,总的来说还是有点小激动的,毕竟,第一次刷完一个体系,在这之前,我在杭电.南阳.洛谷.leetcode.以及我们自己学校的OJ上刷过,但都没有完完整 ...

  8. scrcpy投屏android手机到电脑

    在mac os下 投票iPhone投屏是最简单不过了,只需要用Quicktime player就可以. 但是在mac下咱投屏android的手机呢,就需要用到scrcpy了. 1.打开终端,输入命令: ...

  9. container-coding-codec

    1 数字容器格式 container format 1.1 一些音频专有的容器: 1.2 静态图像专用的容器: 1.3 视频容器,可以容纳多种类型的音频和视频以及其他媒体 1.4 视频容器格式概述 1 ...

  10. Linux centos7 sed工具介绍

    一.sed上 grep工具功能只能实现查找,不能把查找的内容替换. sed本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行查找.删除.替换字符或字符串.调换字符串位置.直接修改文件内容等 ...