ICode9

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

单位根反演 小猪佩奇学数学

2021-06-12 20:34:13  阅读:272  来源: 互联网

标签:frac sum 单位根 反演 k1 np 0k omega 佩奇


题面
一个比较纯粹的推式子题目,第一步先将整除拆开:
∑ i = 0 n ( n i ) p i 1 k ( i − i m o d    k ) \sum_{i=0}^n \binom{n}{i} p^i \frac{1}{k}(i-i \mod k) ∑i=0n​(in​)pik1​(i−imodk)
拆开括号并枚举余数:
1 k ( ∑ i = 0 n ( n i ) p i i − ( n i ) p i ∑ j = 0 k − 1 [ ( i − j ) m o d    k = 0 ] j ) \frac{1}{k}(\sum_{i=0}^n \binom{n}{i} p^i i-\binom{n}{i}p^i \sum_{j=0}^{k-1}[(i-j)\mod k=0]j) k1​(∑i=0n​(in​)pii−(in​)pi∑j=0k−1​[(i−j)modk=0]j)
利用组合数公式以及单位根反演得:
1 k ( ∑ i = 1 n ( n − 1 i − 1 ) n p i − ( n i ) p i ∑ j = 0 k − 1 j k ∑ t = 0 k − 1 ω k t ( i − j ) ) \frac{1}{k}(\sum_{i=1}^n \binom{n-1}{i-1}n p^i-\binom{n}{i}p^i \sum_{j=0}^{k-1} \frac{j}{k} \sum_{t=0}^{k-1} \omega_k^{t(i-j)}) k1​(∑i=1n​(i−1n−1​)npi−(in​)pi∑j=0k−1​kj​∑t=0k−1​ωkt(i−j)​)
根据二项式定理整理:
1 k ( n p ( p + 1 ) n − 1 − 1 k ∑ j = 0 k − 1 j ∑ t = 0 k − 1 ω k − t j ∑ i = 0 n ( n i ) p i ω k t i ) \frac{1}{k}(np(p+1)^{n-1}-\frac{1}{k} \sum_{j=0}^{k-1}j \sum_{t=0}^{k-1} \omega_k^{-tj} \sum_{i=0}^n \binom{n}{i} p^i \omega_k^{ti}) k1​(np(p+1)n−1−k1​∑j=0k−1​j∑t=0k−1​ωk−tj​∑i=0n​(in​)piωkti​)
再用二项式定理:
1 k ( n p ( p + 1 ) n − 1 − 1 k ∑ j = 0 k − 1 ∑ t = 0 k − 1 j ω k − t j ( p ω k t + 1 ) n ) \frac{1}{k}(np(p+1)^{n-1}-\frac{1}{k} \sum_{j=0}^{k-1} \sum_{t=0}^{k-1} j \omega_k^{-tj}(p \omega_k^t+1)^n) k1​(np(p+1)n−1−k1​∑j=0k−1​∑t=0k−1​jωk−tj​(pωkt​+1)n)
根据这个式子的结构可以用任意模长DFT来求解,但又由于是等差乘等比的结构,可以使用特殊的方法:
1 k ( n p ( p + 1 ) n − 1 − 1 k ∑ j = 0 k − 1 ∑ t = 0 k − 1 ( p ω k t + 1 ) n ∑ i = 0 j − 1 ω k − t j ) \frac{1}{k}(np(p+1)^{n-1}-\frac{1}{k} \sum_{j=0}^{k-1} \sum_{t=0}^{k-1} (p \omega_k^t+1)^n\sum_{i=0}^{j-1} \omega_k^{-tj}) k1​(np(p+1)n−1−k1​∑j=0k−1​∑t=0k−1​(pωkt​+1)n∑i=0j−1​ωk−tj​)
交换求和顺序:
1 k ( n p ( p + 1 ) n − 1 − 1 k ∑ t = 0 k − 1 ( p ω k t + 1 ) n ∑ i = 0 k − 2 ∑ j = i + 1 k − 1 ω k − t j ) \frac{1}{k}(np(p+1)^{n-1}-\frac{1}{k} \sum_{t=0}^{k-1}(p \omega_k^t+1)^n \sum_{i=0}^{k-2} \sum_{j=i+1}^{k-1} \omega_k^{-tj}) k1​(np(p+1)n−1−k1​∑t=0k−1​(pωkt​+1)n∑i=0k−2​∑j=i+1k−1​ωk−tj​)
利用等比数列求和:
1 k ( n p ( p + 1 ) n − 1 − 1 k ∑ t = 0 k − 1 ( p ω k t + 1 ) n ∑ i = 0 k − 2 ω k − t k − ω k − t ( i + 1 ) ω k − t − 1 ) \frac{1}{k}(np(p+1)^{n-1}-\frac{1}{k} \sum_{t=0}^{k-1} (p \omega_k^t+1)^n\sum_{i=0}^{k-2} \frac{\omega_k^{-tk}- \omega_{k}^{-t(i+1)}}{\omega_{k}^{-t}-1}) k1​(np(p+1)n−1−k1​∑t=0k−1​(pωkt​+1)n∑i=0k−2​ωk−t​−1ωk−tk​−ωk−t(i+1)​​)
整理式子,得到:
1 k ( n p ( p + 1 ) n − 1 − 1 k ∑ t = 0 k − 1 ( p ω k t + 1 ) n ω k − t − 1 ∑ i = 0 k − 1 ( 1 − ω k − t ( i + 1 ) ) ) \frac{1}{k}(np(p+1)^{n-1}-\frac{1}{k}\sum_{t=0}^{k-1}\frac{(p \omega_k^t+1)^n}{\omega_{k}^{-t}-1}\sum_{i=0}^{k-1} (1- \omega_{k}^{-t(i+1)})) k1​(np(p+1)n−1−k1​∑t=0k−1​ωk−t​−1(pωkt​+1)n​∑i=0k−1​(1−ωk−t(i+1)​))
根据单位根的性质:
1 k ( n p ( p + 1 ) n − 1 − 1 k ∑ t = 0 k − 1 ( p ω k t + 1 ) n ω k − t − 1 k ) \frac{1}{k}(np(p+1)^{n-1}-\frac{1}{k}\sum_{t=0}^{k-1}\frac{(p \omega_k^t+1)^n}{\omega_{k}^{-t}-1}k) k1​(np(p+1)n−1−k1​∑t=0k−1​ωk−t​−1(pωkt​+1)n​k)
最终得到:
1 k ( n p ( p + 1 ) n − 1 − ∑ i = 0 k − 1 ( p ω k i + 1 ) n ω k − i − 1 ) \frac{1}{k}(np(p+1)^{n-1}-\sum_{i=0}^{k-1}\frac{(p \omega_k^i+1)^n}{\omega_{k}^{-i}-1}) k1​(np(p+1)n−1−∑i=0k−1​ωk−i​−1(pωki​+1)n​)
这里的式子当 i i i 取 0 0 0时是错误的,中途不能使用等比数列求和公式。实际答案应该为:
1 k ( n p ( p + 1 ) n − 1 − k − 1 2 ( p + 1 ) n − ∑ i = 1 k − 1 ( p ω k i + 1 ) n ω k − i − 1 ) \frac{1}{k}(np(p+1)^{n-1}-\frac{k-1}{2}(p+1)^n-\sum_{i=1}^{k-1}\frac{(p \omega_k^i+1)^n}{\omega_{k}^{-i}-1}) k1​(np(p+1)n−1−2k−1​(p+1)n−∑i=1k−1​ωk−i​−1(pωki​+1)n​)
时间复杂度 O ( k log ⁡ 2 n ) O(k \log_2n) O(klog2​n),空间复杂度 O ( 1 ) O(1) O(1)

#include<iostream>
using namespace std;
#define R register int
#define L long long
#define I inline
#define P 998244353
I int PowMod(int x,int y){
	int res=1;
	while(y!=0){
		if((y&1)==1){
			res=(L)res*x%P;
		}
		y>>=1;
		x=(L)x*x%P;
	}
	return res;
}
int main(){
	int n,p,k,w,pw=1,ans=0;
	cin>>n>>p>>k;
	w=PowMod(3,(P-1)/k);
	for(R i=1;i!=k;i++){
		pw=(L)pw*w%P;
		ans=((L)PowMod(((L)p*pw+1)%P,n)*PowMod(PowMod(pw,P-2)+P-1,P-2)+ans)%P;
	}
	ans=(499122177ll*(k-1)%P*PowMod(p+1,n)+ans)%P;
	ans=((L)n*p%P*PowMod(p+1,n-1)-ans+P)%P;
	cout<<(L)ans*PowMod(k,P-2)%P;
	return 0;
}

标签:frac,sum,单位根,反演,k1,np,0k,omega,佩奇
来源: https://blog.csdn.net/Defener/article/details/117854747

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

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

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

ICode9版权所有