ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

单位根反演学习笔记

2021-03-28 21:32:57  阅读:215  来源: 互联网

标签:frac limits int sum 单位根 笔记 反演 rg binom


单位根反演学习笔记

公式

\([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}\)。

应用

P5591 小猪佩奇学数学

题目描述

给定 \(n,p,k\),求

\[\sum\limits_{i=0}^n \binom n i \times p^{i} \times \left\lfloor \dfrac{i}{k} \right\rfloor \bmod 998244353 ,1 \leq n,p <998244353,k \in \{2^{w}|0 \leq w \leq 20\} \]

分析

\(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\) 的时间复杂度内计算。

这道题中单位根的带换和二项式定理的使用是很巧妙的。

代码

#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;
}

标签:frac,limits,int,sum,单位根,笔记,反演,rg,binom
来源: https://www.cnblogs.com/liuchanglc/p/14590060.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有