单位根反演学习笔记
2021-03-28 21:24
155 查看
单位根反演学习笔记
公式
[n|a]=\dfrac{1}{n}\sum\limits_{k=0}^{n-1}w_n^{ak}
当 a=0 \pmod n 时,w_n^{ak}=1,所以该式的值为 1。
当 a \ne 0 \pmod n 时,根据等比数列的求和公式,
原式 =\dfrac{1}{n}\sum\limits_{k=0}^{n-1}w_n^{ak}=\dfrac{1}{n}\dfrac{w_n^{an}-1}{w_n^a-1},
分子部分的值为 0,所以整个式子的值为 0。
也可以推导出下面的形式:
[a=b\pmod n]=[a-b=0\pmod n]=\dfrac{1}{n}\sum\limits_{i=0}^{n-1}w_n^{(a-b)k}=\dfrac{1}{n}\sum\limits_{i=0}^{n-1}w_n^{ak}w_n^{-bk}。
应用
题目描述
给定 n,p,k,求
### 分析 $k$ 的范围给的很有特点,不难猜出是单位根反演。 发现 $\left\lfloor \dfrac{i}{k} \right\rfloor =(\sum_{j=0}^i[k|j])-1$, 带入原式,有 $\begin{aligned}\sum\limits_{i=0}^n \binom n i p^{i} ((\sum_{j=0}^i[k|j])-1)&=\sum\limits_{i=0}^n \binom n i p^{i} ((\sum_{j=0}^i\frac{1}{k}\sum_{d=0}^{k-1}w_k^{dj})-1)\\&= \sum\limits_{i=0}^n \binom n i p^{i} \sum_{j=0}^i\frac{1}{k}\sum_{d=0}^{k-1}w_k^{dj}-\sum_{i=0}^n\binom n ip^i\\ &=\frac{1}{k}\sum_{d=0}^{k-1}\sum_{i=0}^n\binom n i p^i\sum_{j=0}^i w_k^{dj}-(p+1)^n\\ \end{aligned}$ 后面的部分可以用等比数列求和公式计算,但是要求公比不能为一,所以要特判 $d=0$ 的情况。 $\begin{aligned}\frac{1}{k}\sum_{d=0}^{k-1}\sum_{i=0}^n\binom n i p^i\sum_{j=0}^i w_k^{dj}-(p+1)^n &=\frac{1}{k}\sum_{d=1}^{k-1}\sum_{i=0}^n\binom n i p^i\frac{w_k^{d(i+1)}-1}{w_k^d-1}-(p+1)^n + \frac{1}{k}\sum_{i=0}^n \binom n i p^i (i+1) \\ &=\frac{1}{k}\sum_{d=1}^{k-1}\frac{\sum_{i=0}^n\binom n i p^i(w_k^{d(i+1)}-1)}{w_k^d-1}-(p+1)^n+\frac{1}{k}\sum_{i=0}^n \binom n ip^i i+\frac{1}{k}\sum_{i=0}^n \binom n ip^i \\ &=\frac{1}{k}\sum_{d=1}^{k-1}\frac{\sum_{i=0}^n\binom n i p^iw_k^{d(i+1)}-\sum_{i=0}^n\binom n i p^i}{w_k^d-1}-(p+1)^n+\frac{1}{k}\sum_{i=0}^n \binom {n-1}{i-1} n p^i+\frac{1}{k}(p+1)^n \\&=\frac{1}{k}\sum_{d=1}^{k-1}\frac{w_k^d\sum_{i=0}^n\binom n i (pw_k^d)^i-(p+1)^n}{w_k^d-1}-(p+1)^n+\frac{1}{k}np(p+1)^{n-1}+\frac{1}{k}(p+1)^n \\&=\frac{1}{k}\sum_{d=1}^{k-1}\frac{w_k^d(pw_k^d+1)^n-(p+1)^n}{w_k^d-1}-(p+1)^n+\frac{1}{k}np(p+1)^{n-1}+\frac{1}{k}(p+1)^n \\ \end{aligned}$ 这个东西就可以在 $klogn$ 的时间复杂度内计算。 这道题中单位根的带换和二项式定理的使用是很巧妙的。 ### 代码 ``` cpp #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> #define rg register template<typename T>void read(rg T& x){ x=0;rg int fh=1; rg char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') fh=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } x*=fh; } const int maxn=2e6+5,mod=998244353,G=3; inline int addmod(rg int now1,rg int now2){ return now1+=now2,now1>=mod?now1-mod:now1; } inline int delmod(rg int now1,rg int now2){ return now1-=now2,now1<0?now1+mod:now1; } inline int mulmod(rg long long now1,rg int now2){ return now1*=now2,now1>=mod?now1%mod:now1; } int ksm(rg int ds,rg int zs){ rg int nans=1; while(zs){ if(zs&1) nans=mulmod(nans,ds); ds=mulmod(ds,ds); zs>>=1; } return nans; } int n,p,k,ans,wn; int main(){ read(n),read(p),read(k); wn=ksm(G,(mod-1)/k); rg int tmp1,tmp2; for(rg int d=1;d<=k-1;d++){ tmp1=ksm(wn,d); tmp2=mulmod(tmp1,ksm(addmod(mulmod(tmp1,p),1),n)); tmp2=delmod(tmp2,ksm(p+1,n)); tmp2=mulmod(tmp2,ksm(delmod(tmp1,1),mod-2)); ans=addmod(ans,tmp2); } ans=mulmod(ans,ksm(k,mod-2)); ans=delmod(ans,ksm(p+1,n)); ans=addmod(ans,mulmod(ksm(k,mod-2),mulmod(n,mulmod(p,ksm(p+1,n-1))))); ans=addmod(ans,mulmod(ksm(k,mod-2),ksm(p+1,n))); printf("%d\n",ans); return 0; } ```相关文章推荐
- 【Unity学习笔记】Unity设置单位长度与像素间的对应关系
- PBRT学习笔记:在单位圆内部均匀采样
- CSS权威指南学习笔记--Chapter4 值和单位
- 【HTML5学习笔记】18:CSS颜色和度量单位
- HTML+CSS学习笔记 (14) - 单位和值
- nginx 学习笔记(6) nginx配置文件中的度量单位
- 前端学习笔记(三) - 文本及列表标签、css基本长度颜色单位及文本和字体样式
- Linux基础学习笔记之硬盘空间计量单位换算与计算机数据计量单位换算区别
- 【学习笔记】信息系统项目监理“四控三管一协调”以及监理工作的分类和监理单位的作用
- Hadoop学习笔记 --- 计算机中存储单位介绍
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
- 莫比乌斯反演学习笔记
- 学习笔记(01):程序员的数学:线性代数-单位矩阵、对称矩阵、正交矩阵
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和...
- 学习笔记(02):程序员的数学:线性代数-单位矩阵、对称矩阵、正交矩阵
- 【HTML5学习笔记】27:CSS3前缀和新单位rem
- [莫比乌斯反演]【学习笔记】[旧]
- [Android新手学习笔记24]-常用的UI控件的单位、属性
- 莫比乌斯反演学习笔记
- 学习笔记 | 反演 | 二项式反演 | 莫比乌斯反演 | 狄利克雷卷积 |容斥 | 未完待更 | 在更