P5437-[XR-2]约定【拉格朗日差值,数学期望】
正題
題目鏈接:https://www.luogu.com.cn/problem/P5437
題目大意
nnn個點的完全圖,連接i,ji,ji,j的邊權值為(i+j)k(i+j)^k(i+j)k。隨機選出一個生成樹,求期望邊權和。
1≤n<998244353,1≤k≤1071\leq n<998244353,1\leq k\leq 10^71≤n<998244353,1≤k≤107
解題思路
一條邊選出來的概率是2n\frac{2}{n}n2?(總共有2n(n?1)\frac{2}{n(n-1)}n(n?1)2?條,選n?1n-1n?1條,或者PruferPruferPrufer序列也能證明)
所以現在考慮怎么求
∑i=1n∑j=1n(i+j)k\sum_{i=1}^n\sum_{j=1}^n(i+j)^ki=1∑n?j=1∑n?(i+j)k
這個東西首先f(n)=∑i=1n∑j=1ni+jf(n)=\sum_{i=1}^n\sum_{j=1}^ni+jf(n)=∑i=1n?∑j=1n?i+j是一個二項式,所以(i+j)k(i+j)^k(i+j)k就是一個k+2k+2k+2次多項式,所以可以考慮用拉插。
現在是如何快速求出1~k1\sim k1~k的值,考慮遞推
f(n)?f(n?1)=∑i=1n∑j=1n(i+j)k?∑i=1n?1∑j=1n?1(i+j)kf(n)-f(n-1)=\sum_{i=1}^n\sum_{j=1}^n(i+j)^k-\sum_{i=1}^{n-1}\sum_{j=1}^{n-1}(i+j)^kf(n)?f(n?1)=i=1∑n?j=1∑n?(i+j)k?i=1∑n?1?j=1∑n?1?(i+j)k
=∑i=n+12n?1ik=\sum_{i=n+1}^{2n-1}i^k=i=n+1∑2n?1?ik
然后用線性篩預處理出iki^kik就好了。當然拉插也要用線性的優化
時間復雜度O(n)O(n)O(n)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e7+10,P=998244353; ll n,k,cnt,pri[N/5],w[N<<1],y[N]; ll pre[N],suf[N],inv[N],ans; bool v[N<<1]; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } void Prime(int n){w[1]=1;for(ll i=2;i<=n;i++){if(!v[i])pri[++cnt]=i,w[i]=power(i,k);for(ll j=1;j<=cnt&&i*pri[j]<=n;j++){v[i*pri[j]]=1;w[i*pri[j]]=w[i]*w[pri[j]]%P;if(i%pri[j]==0)break;}}return; } signed main() {scanf("%lld%lld",&n,&k);Prime(k*2+6);k+=3;pre[0]=suf[k+1]=inv[1]=1;y[2]=w[3];for(ll i=3;i<=k;i++)y[i]=(y[i-1]+w[i*2-1]+w[i*2-2]-w[i])%P;for(ll i=1;i<=k;i++)y[i]=(y[i-1]+y[i])%P;for(ll i=1;i<=k;i++)pre[i]=pre[i-1]*(n-i)%P;for(ll i=k;i>=1;i--)suf[i]=suf[i+1]*(n-i)%P;for(ll i=2;i<=k;i++)inv[i]=P-inv[P%i]*(P/i)%P;inv[0]=1;for(ll i=1;i<=k;i++)inv[i]=inv[i-1]*inv[i]%P;for(ll i=1;i<=k;i++)(ans+=pre[i-1]*suf[i+1]%P*inv[i-1]%P*inv[k-i]%P*y[i]%P*(((k-i)&1)?-1:1))%=P;printf("%lld\n",(ans+P)%P*power(n,P-2)%P*2%P);return 0; }總結
以上是生活随笔為你收集整理的P5437-[XR-2]约定【拉格朗日差值,数学期望】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LOL奥恩辅助双重位移,双重控制攻略解析
- 下一篇: P3793-由乃救爷爷【分块,ST表】