【洛谷3768】简单的数学题【莫比乌斯反演】【杜教筛】【小学奥数】
传送门
题意:给定p,Np,Np,N,求
∑i=1N∑j=1Nijgcd(i,j)modp\sum_{i=1}^{N}\sum_{j=1}^{N}ijgcd(i,j)\text{ }mod \text{ }pi=1∑Nj=1∑Nijgcd(i,j) mod p
ppp为质数,在1e91e91e9左右
N≤1e10N \leq 1e10N≤1e10
神仙题
前置芝士:杜教筛
懒得重新写,所以顺便讲一下
杜教筛可以在非线性时间求积性函数的前缀和
设所求函数为f(n)f(n)f(n),S(n)为前缀和S(n)为前缀和S(n)为前缀和
S(n)=∑i=1nf(i)S(n)=\sum_{i=1}^{n}f(i)S(n)=i=1∑nf(i)
构造一个可以快速计算前缀和的函数g(n)g(n)g(n),且和f(n)f(n)f(n)的狄利克雷卷积(f∗g)(n)(f*g)(n)(f∗g)(n)的前缀和可以快速求出
考虑
∑i=1n(f∗g)(i)\sum_{i=1}^{n}(f*g)(i)i=1∑n(f∗g)(i)
暴力拆开
∑i=1n∑d∣if(d)g(id)\sum_{i=1}^{n}\sum_{d \mid i}f(d)g(\frac{i}{d})i=1∑nd∣i∑f(d)g(di)
枚举ddd
∑d=1ng(d)∑d∣if(id)\sum_{d=1}^{n}g(d)\sum_{d \mid i}f(\frac{i}{d})d=1∑ng(d)d∣i∑f(di)
∑d=1ng(d)S(⌊nd⌋)\sum_{d=1}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)d=1∑ng(d)S(⌊dn⌋)
我们要求的是S(n)S(n)S(n),所以可以求出g(1)S(n)g(1)S(n)g(1)S(n)
即
∑d=1ng(d)S(⌊nd⌋)−∑d=2ng(d)S(⌊nd⌋)\sum_{d=1}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)-\sum_{d=2}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)d=1∑ng(d)S(⌊dn⌋)−d=2∑ng(d)S(⌊dn⌋)
换成上面
∑i=1n(f∗g)(i)−∑d=2ng(d)S(⌊nd⌋)\sum_{i=1}^{n}(f*g)(i)-\sum_{d=2}^{n}g(d)S(\lfloor\frac{n}{d}\rfloor)i=1∑n(f∗g)(i)−d=2∑ng(d)S(⌊dn⌋)
左边直接求,右边整除分块套递归
复杂度是O(N34)O(N^\frac{3}{4})O(N43)
如果线性筛出N23N^\frac{2}{3}N32以内的并用mapmapmap记忆化,可以达到O(N23)O(N^\frac{2}{3})O(N32)
正文
∑i=1N∑j=1Nijgcd(i,j)\sum_{i=1}^{N}\sum_{j=1}^{N}ijgcd(i,j)i=1∑Nj=1∑Nijgcd(i,j)
套路
∑d=1N∑i=1N∑j=1N[gcd(i,j)=d]ijd\sum_{d=1}^{N}\sum_{i=1}^{N}\sum_{j=1}^{N}[gcd(i,j)=d]ijdd=1∑Ni=1∑Nj=1∑N[gcd(i,j)=d]ijd
∑d=1Nd∑i=1N∑j=1N[gcd(i,j)=d]ij\sum_{d=1}^{N}d\sum_{i=1}^{N}\sum_{j=1}^{N}[gcd(i,j)=d]ijd=1∑Ndi=1∑Nj=1∑N[gcd(i,j)=d]ij
右边可以反演
设
f(n)=∑i=1N∑j=1N[gcd(i,j)=n]ijf(n)=\sum_{i=1}^{N}\sum_{j=1}^{N}[gcd(i,j)=n]ijf(n)=i=1∑Nj=1∑N[gcd(i,j)=n]ij
F(d)=∑d∣nf(n)=∑i=1N∑j=1N[d∣i][d∣j]ijF(d)=\sum_{d\mid n}f(n)=\sum_{i=1}^{N}\sum_{j=1}^{N}[d\mid i][d\mid j]ijF(d)=d∣n∑f(n)=i=1∑Nj=1∑N[d∣i][d∣j]ij
记sum(n)=n(n+1)2sum(n)=\frac{n(n+1)}{2}sum(n)=2n(n+1)
F(d)=d2(sum⌊Nd⌋)2F(d)=d^2(sum\lfloor\frac{N}{d}\rfloor)^2F(d)=d2(sum⌊dN⌋)2
f(d)=∑d∣nF(n)μ(nd)=∑d∣nn2(sum⌊Nn⌋)2μ(nd)f(d)=\sum_{d\mid n}F(n)\mu(\frac{n}{d})=\sum_{d\mid n}n^2(sum\lfloor\frac{N}{n}\rfloor)^2\mu(\frac{n}{d})f(d)=d∣n∑F(n)μ(dn)=d∣n∑n2(sum⌊nN⌋)2μ(dn)
原来求的是
∑d=1Ndf(d)\sum_{d=1}^{N}df(d)d=1∑Ndf(d)
∑d=1Nd∑d∣nn2(sum⌊Nn⌋)2μ(nd)\sum_{d=1}^{N}d\sum_{d\mid n}n^2(sum\lfloor\frac{N}{n}\rfloor)^2\mu(\frac{n}{d})d=1∑Ndd∣n∑n2(sum⌊nN⌋)2μ(dn)
枚举nnn
∑n=1Nn2(sum⌊Nn⌋)2∑d∣ndμ(nd)\sum_{n=1}^{N}n^2(sum\lfloor\frac{N}{n}\rfloor)^2\sum_{d \mid n}d\mu(\frac{n}{d})n=1∑Nn2(sum⌊nN⌋)2d∣n∑dμ(dn)
右边就是φ\varphiφ
∑n=1N(sum⌊Nn⌋)2n2φ(n)\sum_{n=1}^{N}(sum\lfloor\frac{N}{n}\rfloor)^2n^2\varphi(n)n=1∑N(sum⌊nN⌋)2n2φ(n)
左边是个整除分块,所以求出右边就可以了
#undef f
设f(n)=n2φ(n)f(n)=n^2\varphi(n)f(n)=n2φ(n)
显然这是个积性函数,考虑杜教筛
(f∗g)(n)=∑d∣ng(d)f(nd)=∑d∣ng(d)n2d2φ(nd)(f*g)(n)=\sum_{d \mid n}g(d)f(\frac{n}{d})=\sum_{d \mid n}g(d)\frac{n^2}{d^2}\varphi(\frac nd)(f∗g)(n)=d∣n∑g(d)f(dn)=d∣n∑g(d)d2n2φ(dn)
令g(n)=n2g(n)=n^2g(n)=n2就可以消掉
则
(f∗g)(n)=∑d∣nn2φ(nd)=n2∑d∣nφ(d)=n3(f*g)(n)=\sum_{d \mid n}n^2\varphi(\frac nd)=n^2\sum_{d \mid n}\varphi(d)=n^3(f∗g)(n)=d∣n∑n2φ(dn)=n2d∣n∑φ(d)=n3
众所周知
12+22+32+...+n2=(n)(n+1)(2n+1)61^2+2^2+3^2+...+n^2=\frac{(n)(n+1)(2n+1)}{6}12+22+32+...+n2=6(n)(n+1)(2n+1)
13+23+33+...+n3=(1+2+3+...+n)21^3+2^3+3^3+...+n^3=(1+2+3+...+n)^213+23+33+...+n3=(1+2+3+...+n)2
两个前缀和都可以O(1)O(1)O(1)算出
这个问题就解决了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <map>
#define MAXN 10000005
using namespace std;
typedef long long ll;
int MOD,inv2,inv6;
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x-y<0? x-y+MOD:x-y;}
inline int mul(const int& x,const int& y){return (ll)x*y%MOD;}
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=mul(ans,a);a=mul(a,a);p>>=1;}return ans;
}
const int N=10000000;
int np[MAXN],pl[1000005],cnt;
int phi[MAXN],f_sum[MAXN];
void init()
{np[1]=phi[1]=1;for (int i=2;i<=N;++i){if (!np[i]) phi[pl[++cnt]=i]=i-1;int x;for (int j=1;(x=i*pl[j])<=N;++j){np[x]=1;if (i%pl[j]==0){phi[x]=mul(phi[i],pl[j]);break;}phi[x]=mul(phi[i],pl[j]-1);}}for (int i=1;i<=N;i++) f_sum[i]=add(f_sum[i-1],mul(phi[i],mul(i,i)));
}
inline int calc(const int& n){return mul(mul(n,n+1),inv2);}
inline int calc2(const int& n){return mul(mul(n,n+1),mul(2*n+1,inv6));}
inline int calc3(const int& n){int t=calc(n);return mul(t,t);}
map<int,int> m;
int getsum(ll n)
{if (n<=N) return f_sum[n];if (m[n]) return m[n];int ans=calc3(n%MOD);for (ll l=2,r;l<=n;l=r+1){r=n/(n/l);int tmp=getsum(n/l);ans=dec(ans,mul(dec(calc2(r%MOD),calc2((l-1)%MOD)),tmp));}return m[n]=ans;
}
//int gcd(int a,int b)
//{// return b? gcd(b,a%b):a;
//}
int main()
{ll n;scanf("%d%lld",&MOD,&n);inv2=(MOD+1)>>1;inv6=qpow(6,MOD-2);init(); int ans=0;
// for (int i=1;i<=n;i++)
// for (int j=1;j<=n;j++)
// ans=(ans+(ll)i*j%MOD*gcd(i,j))%MOD;
// cerr<<ans<<'\n';
// ans=0;for (ll l=1,r;l<=n;l=r+1){r=n/(n/l);ans=add(ans,mul(calc3((n/l)%MOD),dec(getsum(r),getsum(l-1))));}printf("%d\n",ans);return 0;
}
【洛谷3768】简单的数学题【莫比乌斯反演】【杜教筛】【小学奥数】相关推荐
- #6229. 这是一道简单的数学题(反演 + 杜教筛)
#6229. 这是一道简单的数学题 推式子 ∑i=1n∑j=1ilcm(i,j)gcd(i,j)=(∑i=1n∑j=1nlcm(i,j)gcd(i,j)+n)∗inv2所以重点求∑i=1n∑j=1nl ...
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- 【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛
题目描述 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i<=N" ...
- P3768 简单的数学题 [狄利克雷卷积,杜教筛,莫比乌斯反演]
简单的数学题 题目连接 https://www.luogu.org/problemnew/show/P3768 题目描述 输入一个正整数n,n≤1010n,n\le 10^{10}n,n≤1010和p ...
- matlab狄利克雷函数,数论入门1——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛...
数论入门1 一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数$\mu(n)$为: 当n有平方因子时,$\mu(n)=0$. 当n没有平方因子时,$\mu(n)=(-1)^{\omega(n)} ...
- 【LOJ#572】Misaka Network 与求和(莫比乌斯反演/杜教筛/min_25筛)
[LOJ#572]Misaka Network 与求和 https://www.cnblogs.com/cjyyb/p/10170630.html 看到次大质因子就可以想到是min_25筛了,然后只需 ...
- 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】
正题 题目链接:https://ac.nowcoder.com/acm/contest/11174/F 题目大意 给出n,kn,kn,k求 ∑i1=1n∑i2=1n...∑ik=1ngcd(fi1,f ...
- 牛客P19836 裴蜀定理+莫比乌斯反演+杜教筛
题意: 一开始一个人在原点,它拥有 n n n个整数 x i x_{i} xi,并且 x i ∈ [ 1 , m ] x_{i}\in[1,m] xi∈[1,m],他每次可以选择一个 x i x_ ...
- CCPC-Wannafly Winter Camp Day3 (Div2, onsite) F 小清新数论 欧拉函数的利用 莫比乌斯反演 杜教筛
F - 小清新数论 做法一:欧拉函数 #include<stdio.h> #include<bits/stdc++.h> using namespace std; #defin ...
- P4450-双亲数,P5221-Product,P6055-[RC-02]GCD【莫比乌斯反演,杜教筛】
除了最后一题都比较简单就写一起了 P4450-双亲数 题目链接:https://www.luogu.com.cn/problem/P4450 题目大意 给出A,B,dA,B,dA,B,d求有多少对(a ...
最新文章
- 2000条你应知的WPF小姿势 基础篇45-50 Visual TreeLogic Tree 附带两个小工具
- matlab的NLP功能,pyhanlp 共性分析与短语提取内容详解
- EJBCA使用之注册用户及创建证书
- Unity手游开发札记——移动平台的天气系统实现
- 20应用统计考研复试要点(part38)--概率论与数理统计
- uniapp使用iconfont字体图标
- C# 序列化技术详解《转》
- SolrCloud Hello Word
- JavaScript-传值(引用类型,基本类型)
- PlaySound 播放内存中的音频数据
- Imagenet与ILSVRC数据集介绍
- 令人不寒而栗的黄蓉(转)
- 6-7-Isomorphic-函数题
- 聊聊 C++ 中的四种类型转换符
- echarts图表y轴数据设置为固定值,等间距,如何自定义echarts图表y轴数据
- OaisimWithS1搭建笔记(2019.5)
- 如何给导师发邮件?【附带邮件模板】
- tf.compat.v1的含义
- ubuntu18.04 install 安装postgresql9.6 解决重音不敏感”排序规则,以及扩展pgcrypto函数
- 关于 ChatGPT 必看的 10 篇论文
热门文章
- 励志!送女儿去厦大读研后,爸爸回家就考了厦大的博士,现在是女儿的“学弟”...
- 50张图,带你认识大学各专业
- 一只蝙蝠的自述在朋友圈火了:千万不要再吃野味了!
- 炸锅了!Google称2029年人类开始实现永生不死!疾病,衰老,痛苦将彻底消失!?
- HTML手机上图片显示被压扁,在重新调整Web浏览器HTML |时,文本会被压扁CSS
- python turtle 绘图_谈一下Pycharm中关联系统Python解释器的方法
- androidstudio学习总结_Android 开发工程师自述:2年的开发,我总结了7条经验
- 华为二面!!!被问常用API,这也太偏门了吧,我秀了一波hhhh~
- 23V3有这种C语言表达式吗,数据结构(C语言版第2版_李云清)习题答案2012-12.doc
- 服务器运行慢都有哪些问题,服务器数据库的运行速度很慢问题