【学习笔记】莫比乌斯反演
前置知识:
积性函数:
对于互质整数 ,,如果有 ,那么称为积性函数,例如
而完全积性函数是对于任意的整数 , ,有的数论函数如
Mobius 函数( μ ):
可以看出, 恰在 无平方因子时取值非零。
可以线性筛
inline void prework(){
miu[1]=1;
for(int i=2;i<N;++i){
if(!vis[i]) pri[cnt++]=i,miu[i]=-1;
for(int j=0;j<cnt&&i*pri[j]<N;++j){}
vis[i*pri[j]]=1; if(i%pri[j]) miu[i*pri[j]]=-miu[i];
else{miu[i*pri[j]]=0; break;}
} miu[i]+=miu[i-1];
} return ;
}
Dirichlet 卷积
同时 函数是 卷积的单位元,即
常见的卷积式子有:
这些卷积的正确性证明都可以通过考察因数的计算次数得到
Mobius 反演
设 是数论函数,定义函数 满足
证明先直接带入并整理,再根据 即可得到除了 之外的 在 中的贡献次数为 而 的贡献次数为
例题
推式子一般使用如下方式
1.枚举 ,除掉
2.
3. 然后提出来
感觉还是理解反演本质非常重要,甚至很多题目都是使用最本源的莫比乌斯反演公式设两个函数就可以得到非常简洁的,可以求解的式子
约数个数和
通过下式将原式展开并使用 中 的倍数个数就能得到简洁表达
最终表达式是积性函数求和,需要搭配线性筛
一个人的数论
设自然数幂前缀和 ,那么则有
将自然数幂表示为多项式,设数列 为其系数:
然后看看后面的部分就是两个函数 和 的狄利克雷卷积,可以线性筛得到,对于这里而言就是把互质的函数值乘起来
把 的值为 的部分消掉之后剩下了:
Code Display
const int mod=1e9+7,N=1010;
inline int ksm(int x,int y){
if(y<0) return ksm(ksm(x,-y),mod-2);
int res=1; for(;y;y>>=1,(x*=x)%=mod) if(y&1) res=res*x%mod;
return res;
}
int ans,n,d,p[N][2],m[N][N],res[N],sum[N];
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
signed main(){
d=read(); n=read();
for(int i=1;i<=n;++i) p[i][0]=read(),p[i][1]=read();
for(int i=0;i<=d+2;++i){
int res=0; for(int j=1;j<=i+1;++j) res=add(res,ksm(j,d));
m[i][d+2]=res; m[i][0]=1;
for(int j=1;j<=d+1;++j) m[i][j]=m[i][j-1]*(i+1)%mod;
}
for(int i=0;i<=d+2;++i){
int t=i;
for(int j=i;j<=d+2;++j) if(m[j][i]){t=j; break;}
for(int j=i;j<=d+2;++j) swap(m[i][j],m[t][j]);
for(int j=i+1;j<=d+2;++j){
int x=m[j][i]*ksm(m[i][i],mod-2)%mod;
for(int k=i;k<=2+d;++k) m[j][k]=(m[j][k]-m[i][k]*x%mod+mod)%mod;
}
}
for(int i=d+2;i>=0;--i){
m[i][d+2]=m[i][d+2]*ksm(m[i][i],mod-2)%mod;
for(int j=i-1;j>=0;--j) m[j][d+2]-=m[i][d+2]*m[j][i]%mod,m[j][d+2]=(m[j][d+2]+mod)%mod;
}
for(int i=0;i<=d+1;++i) res[i]=m[i][d+2];
// Solve Equation
for(int i=0;i<=d+1;++i){
int tmp=1;
for(int j=1;j<=n;++j){
tmp=tmp*ksm(p[j][0],p[j][1]*i)%mod*((1-ksm(p[j][0],d-i)+mod)%mod)%mod;
}
ans=add(ans,res[i]*tmp%mod);
} cout<<ans<<endl;
return 0;
}
2021-03-29 数列
原题可以被分成快速求 数列和求行列式两部分
第一部分考虑将原题中的式子分成 对 的模数进行考虑
那么不难用 的时间将原题转化成一个 的子问题,复杂度 ,不能通过
考虑预处理序列的前 位那么复杂度变为
第二问考虑设
所以矩阵会转化成 ,证明考虑归纳,然后手动消下一行的元
这部分复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律