P5591 小猪佩奇学数学 (单位根反演)

本文探讨了单位根反演在处理特定组合数学问题中的应用,通过将问题分解并利用二项式定理及单位根反演,有效地解决了涉及地板函数的求和问题。文章提供了一个具体的算法实现,展示了如何在O(n)的时间复杂度内解决此类问题。

传送门

  • 思路:题目提示得很明显是单位根反演,我们将 ⌊ i k ⌋ \lfloor\frac{i}{k}\rfloor ki 拆成 i − i % k k \frac{i-i\%k}{k} kii%k,前半部分用二项式定理,用单位根反演处理后半部分,即
    ∑ t = 1 k − 1 t ∑ i = 0 n ( n i ) p i ∑ j = 0 k − 1 ω k j ( i − t ) k = 1 k ∑ t t ∑ j = 0 k − 1 ω k − j t ( p ω k j + 1 ) n = 1 k ∑ j ( p ω k j + 1 ) n ∑ t t ω k − t j \sum_{t=1}^{k-1}t\sum_{i=0}^{n}\binom{n}{i}p^i\frac{\sum_{j=0}^{k-1}\omega_k^{j(i-t)}}{k}\\=\frac{1}{k}\sum_{t}t\sum_{j=0}^{k-1}\omega^{-jt}_k(p\omega^j_k+1)^n\\=\frac{1}{k}\sum_j(p\omega_k^j+1)^n\sum_tt\omega_k^{-tj} t=1k1ti=0n(in)pikj=0k1ωkj(it)=k1ttj=0k1ωkjt(pωkj+1)n=k1j(pωkj+1)nttωktj
    j j j 是否为 0 讨论,不为 0 可以等比数列求和,如果用 b s g s bsgs bsgs 求幂,线性求逆元的话可以 O ( n ) O(n) O(n)
#include<bits/stdc++.h>
#define cs const
using namespace std;
typedef long long ll;
cs int Mod = 998244353;
int add(int a, int b){ return a + b >= Mod ? a + b - Mod : a + b; }
int dec(int a, int b){ return a - b < 0 ? a - b + Mod : a - b; }
int mul(int a, int b){ return 1ll * a * b % Mod; }
void Add(int &a, int b){ a = add(a,b); }
void Mul(int &a, int b){ a = mul(a,b); }
void Dec(int &a, int b){ a = dec(a,b); }
int ksm(int a, int b){ int as=1; for(;b;b>>=1,a=mul(a,a)) if(b&1) as=mul(as,a); return as; }
cs int N = 1 << 20 | 5;
int n, p, k; int w[N];
int main(){
	#ifdef FSYolanda
	freopen("1.in","r",stdin);
	#endif
	scanf("%d%d%d",&n,&p,&k); int ik=ksm(k,Mod-2);
	int A=mul(mul(n,p),ksm(p+1,n-1)), B=0;
	int wn=ksm(3,(Mod-1)/k); w[0]=1;
	for(int i=1; i<k; i++) w[i]=mul(w[i-1],wn);
	for(int i=0; i<k; i++){
		int coe=ksm(add(mul(p,w[i]),1),n);
		if(i==0) Add(B,mul(coe,((ll)k*(k-1)>>1)%Mod));
		else Add(B,mul(coe,mul(k,ksm(dec(w[k-i],1),Mod-2))));
	} Mul(B,ik); cout<<mul(ik,dec(A,B)); return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值