P5591-小猪佩奇学数学【单位根反演】
正題
題目鏈接:https://www.luogu.com.cn/problem/P5591
題目大意
給出n,p,kn,p,kn,p,k求
(∑i=0n(ni)pi?ik?)mod998244353\left(\sum_{i=0}^n\binom{n}{i}p^i\left\lfloor\frac{i}{k}\right\rfloor \right)\mod 998244353(i=0∑n?(in?)pi?ki??)mod998244353
1≤n,p<998244353,k=2w(w∈[0,20])1\leq n,p<998244353,k=2^w(w\in[0,20])1≤n,p<998244353,k=2w(w∈[0,20])
解題思路
開始以為推錯(cuò)了,結(jié)果是要特判
推出了看上去不是我能推的式子
∑i=1n(ni)pi∑j=1i[k∣j]\sum_{i=1}^n\binom{n}{i}p^i\sum_{j=1}^i[k|j]i=1∑n?(in?)pij=1∑i?[k∣j]
然后單位根反演
∑i=1n(ni)pi∑j=1i1k∑l=0k?1ωkl×j\sum_{i=1}^n\binom{n}{i}p^i\sum_{j=1}^i\frac{1}{k}\sum_{l=0}^{k-1}\omega_k^{l\times j}i=1∑n?(in?)pij=1∑i?k1?l=0∑k?1?ωkl×j?
系統(tǒng)整理一下
1k∑l=0k?1∑i=1n(ni)pi∑j=1iωkl×j\frac{1}{k}\sum_{l=0}^{k-1}\sum_{i=1}^n\binom{n}{i}p^i\sum_{j=1}^i\omega_k^{l\times j}k1?l=0∑k?1?i=1∑n?(in?)pij=1∑i?ωkl×j?
然后等比數(shù)列通項(xiàng)公式拆開
1k∑l=0k?1∑i=1n(ni)piωkl?ωkliωkl1?ωkl\frac{1}{k}\sum_{l=0}^{k-1}\sum_{i=1}^n\binom{n}{i}p^i\frac{\omega_k^l-\omega_{k}^{li}\omega^l_k}{1-\omega_k^l}k1?l=0∑k?1?i=1∑n?(in?)pi1?ωkl?ωkl??ωkli?ωkl??
1k∑l=0kωkl1?ωkl(∑i=1n(ni)pi?∑i=1n(ni)piωkli)\frac{1}{k}\sum_{l=0}^k\frac{\omega_k^l}{1-\omega_k^l}\left(\sum_{i=1}^n\binom{n}{i}p^i-\sum_{i=1}^n\binom{n}{i}p^i\omega_k^{li}\right)k1?l=0∑k?1?ωkl?ωkl??(i=1∑n?(in?)pi?i=1∑n?(in?)piωkli?)
1k∑l=0kωkl1?ωkl((p+1)n?(pωkl+1)n)\frac{1}{k}\sum_{l=0}^k\frac{\omega_k^l}{1-\omega_k^l}\left((p+1)^n-(p\omega_k^l+1)^n\right)k1?l=0∑k?1?ωkl?ωkl??((p+1)n?(pωkl?+1)n)
然后寫出來會愉快的發(fā)現(xiàn)沒有過樣例,仔細(xì)看我們式子里面有一個(gè)ωkl1?ωkl\frac{\omega_k^l}{1-\omega_k^l}1?ωkl?ωkl??。
當(dāng) l=0l=0l=0 的時(shí)候1?ωkl=01-\omega_k^l=01?ωkl?=0,所以不能直接這么求,我們這個(gè)得分開考慮。
就是
∑i=1n(ni)pii?∑i=1nn!(i?1)!(n?i)!pi\sum_{i=1}^n\binom{n}{i}p^ii\Rightarrow \sum_{i=1}^n\frac{n!}{(i-1)!(n-i)!}p^ii=1∑n?(in?)pii?i=1∑n?(i?1)!(n?i)!n!?pi
np∑i=1n(n?1)!(i?1)!(n?i)!pi?1?n∑i=1n(n?1i)pi?1?np(p+1)n?1np\sum_{i=1}^n\frac{(n-1)!}{(i-1)!(n-i)!}p^{i-1}\Rightarrow n\sum_{i=1}^n\binom{n-1}{i}p^{i-1}\Rightarrow np(p+1)^{n-1}npi=1∑n?(i?1)!(n?i)!(n?1)!?pi?1?ni=1∑n?(in?1?)pi?1?np(p+1)n?1
就好了
時(shí)間復(fù)雜度:O(klog?P):O(k\log P):O(klogP)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll P=998244353; ll n,p,k,ans; ll power(ll x,ll b){ll ans=1;x%=P;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } signed main() {scanf("%lld%lld%lld",&n,&p,&k);ll d=power(3,(P-1)/k);ans=n*p%P*power(p+1,n-1)%P;for(ll i=1,w=d;i<k;i++,w=w*d%P){ll inv=power(P+1-w,P-2)*w%P;ans+=power(p+1,n)*inv%P;ans-=power(w*p+1,n)*inv%P;ans=(ans+P)%P;}printf("%lld\n",ans*power(k,P-2)%P);return 0; }總結(jié)
以上是生活随笔為你收集整理的P5591-小猪佩奇学数学【单位根反演】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器上怎么配php环境(服务器上怎么配
- 下一篇: P3706-[SDOI2017]硬币游戏