题目链接

  emm标题全称应该叫“莫比乌斯反演求出可狄利克雷卷积的公式然后卷积之后搞杜教筛”

  然后成功地困扰了我两天qwq

  我们从最基本的题意开始,一步步往下推

  首先题面给出的公式是$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ijgcd(i,j)$

  枚举gcd(i,j)=w,得到

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

  这时候我们设一个$f(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[x=gcd(i,j)]$

  一个$F(x)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}ij[x|gcd(i,j)]$

  容易发现(其实就是为了凑莫比乌斯公式才搞的这两个函数,在构造函数之前就“容易发现”了)

  $F(x)=\sum\limits_{x|d}f(d)$

  怎么样……像莫比乌斯反演公式吧

  $f(d)=\sum\limits_{d|x}\mu(\frac{x}{d})F(x)$

  然后原式就变成了

  $\sum\limits_{w=1}^{n}w\sum\limits_{w|t}\mu(\frac{t}{w})F(t)$

  据说莫比乌斯反演构造的F(x)一定要简单易求

  然后……自己找几组规律可以发现$F(x)=(x+2x+3x+......+\frac{n}{x}x)^2$

  然后……继续找规律发现一个问题,就是你可以把x提出来。qwq。

  于是F(x)成功的变成了$x^2(1+2+3+......+\frac{n}{x})^2$

  然后我们回头去找扔掉的原式qwq

  原式=$\sum\limits_{w=1}^{n}w\sum\limits_{w|t}\mu(\frac{t}{w})F(t)$

  $=\sum\limits_{w=1}^{n}w^3\sum\limits_{w|t}\mu(\frac{t}{w})\frac{t}{w}^2(1+.......+\frac{n}{t})^2$

  emm我们似乎发现了什么……

  于是就设$d=\frac{t}{w}$

  然后把原式就整理成了

  $\sum\limits_{w=1}^{n}w^3\sum\limits_{d=1}^{\frac{n}{w}}\mu(d)d^2(1+.......+\frac{n}{wd})^2$

  到此为止就有60分啦。不需要杜教筛狄利克雷卷积什么乱七八糟的玩意。

  (然后剩下40分花掉了我一天+22个半小时)

  然后我自己差不多就想到这里为止了。剩下的是rqy的脑补。

  看到这里面一大堆下取整的玩意我们rqy非常不爽。

  然后他先把公式颠倒了一下

  $\sum\limits_{d=1}^{n}\mu(d)d^2\sum\limits_{w=1}^{\frac{n}{d}}w^3(1+......+\frac{n}{wd})^2$

  又令k=wd

  然后改成枚举k

  式子就变成了$\sum\limits_{k=1}^{n}\sum\limits_{d|k}\mu(\frac{k}{d})(\frac{k}{d})^2d^3(1+....+\frac{n}{k})^2$

  =$\sum\limits_{k=1}^{n}\sum\limits_{d|k}\mu(\frac{k}{d})k^2d(1+....+\frac{n}{k})^2$

  发现有两项$k^2$,$(1+....+\frac{n}{k})^2$跟d没什么卵关系

  提出来提出来

  $\sum\limits_{k=1}^{n}k^2(1+....+\frac{n}{k})^2\sum\limits_{d|k}\mu(\frac{k}{d})d$

  好,恭喜你$\sum\limits_{d|k}\mu(\frac{k}{d})d=\phi(k)$

  为什么呢?因为根据狄利克雷卷积公式$\mu*1=e$

  $\phi*1=n$

  所以$n*\mu=\phi*1*\mu=\phi*e=\phi$

  然后你列一列这个卷积公式。

  惊不惊喜?意不意外?

  然后原式变成了$\sum\limits_{k=1}^{n}k^2(1+....+\frac{n}{k})^2\phi(k)$

  然后一看到$\frac{n}{k}$有根号n种,非常激动,

  然后现在的问题就变成了怎么快速求$k^2\phi(k)$的前缀和

  然后发现这个玩意用杜教筛好像很可做的样子

  码了码了

  

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<algorithm>
#include<map>
#define maxn 4000100
using namespace std; map<long long,long long>_sum;
long long sum[maxn];
long long phi[maxn];
long long prime[maxn],tot;
bool vis[maxn];
long long mod;
long long mod6; long long Pow(long long n,long long i,long long p){
long long ret=;
while(i){
if(i&) ret=(ret*n)%p;
n=(n*n)%p;
i>>=;
}
return ret;
} inline long long calc(long long n,long long p){
n%=p;
long long ans=((+n)*n%p)*mod%p;
ans=(ans*ans)%p;
return ans;
} inline long long calcs(long long n,long long p){
n%=p;
long long ans=(n*(n+)%p)*(*n+)%p;
ans=ans*mod6%p;
return ans;
} long long calcsum(long long n,long long p){
if(n<maxn) return sum[n];
if(_sum.count(n)) return _sum[n];
long long x=,ans=calc(n,p);
while(x<=n){
long long y=n/(n/x);
ans=((ans-((calcs(y,p)-calcs(x-,p)+p)%p)*calcsum(n/x,p)%p)+p)%p;
x=y+;
}
return _sum[n]=ans;
} int main(){
long long p,n;
scanf("%lld%lld",&p,&n);
mod=Pow(,p-,p);
mod6=Pow(,p-,p);
vis[]=sum[]=;
for(register long long i=;i<maxn;++i){
if(!vis[i]){
prime[++tot]=i;
phi[i]=i-;
sum[i]=((1LL*i*i)%p*phi[i])%p;
}
for(long long j=;j<=tot&&i*prime[j]<maxn;++j){
vis[i*prime[j]]=;long long now=i*prime[j];
if(i%prime[j]){
phi[now]=(phi[i]*(prime[j]-))%p;
sum[now]=(phi[now]*now)%p*now%p;
}
else{
phi[now]=(phi[i]*prime[j])%p;
sum[now]=(phi[now]*now)%p*now%p;
break;
}
}
}
for(long long i=;i<maxn;++i) sum[i]=(sum[i]+sum[i-])%p;
long long x=,ans=;
while(x<=n){
long long y=n/(n/x);
ans+=((calcsum(y,p)-calcsum(x-,p)+p)%p)*calc(n/x,p)%p;
ans%=p;
x=y+;
}
printf("%lld",ans);
return ;
}

  然后这就是码qwq。

【Luogu】P3768简单的数学题(杜教筛)的更多相关文章

  1. luogu P3768 简单的数学题 杜教筛 + 欧拉反演 + 逆元

    求 $\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j)$   考虑欧拉反演: $\sum_{d|n}\varphi(d)=n$   $\Rightarrow \sum_{i ...

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

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

  3. 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 ...

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

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

  5. Luogu P3768 简单的数学题

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

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

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

  7. luogu P4213 【模板】杜教筛(Sum)

    Code: #include <bits/stdc++.h> #include <tr1/unordered_map> using namespace std; using n ...

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

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

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

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

随机推荐

  1. 《spss统计分析与行业应用案例详解》:实例十二 卡方检验

    卡方检验的功能与意义 SPSS的卡方检验是非参数检验方法的一种,其基本功能足通过样本的 频数分布来推断总体是否服从某种理论分布或某种假设分布,这种检验过程是通过分析实际的频数与理论的频数之间的差别或是 ...

  2. [手势识别] CNN + OpenCV 手势识别记录

    这几天没事,想着再学点一些视觉识别方向的东西,因为之前做了验证码识别,有了机器学习的信心,因此这次打算做个手势识别,参考了很多网上的图像处理方式,中间也遇到了很多问题,最终算是做出来了吧. 1.训练集 ...

  3. pip和apt-get换源

    pip换源 一下方法对pip和pip3同时起作用 永久换源 运行一下命令: cd ~/.pip 如果提示目录不存在的话,我们要自行创建一个,再进入目录 mkdir ~/.pip cd ~/.pip 在 ...

  4. python 嵌套作用域 闭包函数

    #闭包函数 def multiplier(factor): def multiplyByFactory(number): return number*factor return multiplyByF ...

  5. Element表单验证(2)

    Element表单验证(2) 上篇讲的是async-validator的基本要素,那么,如何使用到Element中以及怎样优雅地使用,就在本篇. 上篇讲到async-validator由3大部分组成 ...

  6. matplot绘图(五)

    b3D图形绘制 # 导包:from mpl_toolkits.mplot3d.axes3d import Axes3Dimport matplotlib.pyplot as plt%matplotli ...

  7. 第一本C语言笔记(上)

    1. 一般地源程序文件到可执行程序文件经过如下四步: 预处理 -- 头文件内容插入.宏替换.删注释(#include.#define) 编译 -- 把预处理过的源文件编程汇编文件 .c -> . ...

  8. windows server2008R2 64位 配置 mysql-8.0.15-winx64

    下载mysql: 1 https://dev.mysql.com/downloads/mysql/ 如图: 然后在解压的文件夹里面新建 my.ini文件,内容如下 按 Ctrl+C 复制代码 按 Ct ...

  9. HDU - 6199 gems gems gems (DP)

    有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...

  10. list_for_each_entry()函数分析

    list_for_each原型: #define list_for_each(pos, head) \ for (pos = (head)->next, prefetch(pos->nex ...