P4831-Scarlet loves WenHuaKe【组合数学】
正題
題目鏈接:https://www.luogu.com.cn/problem/P4831
題目大意
n?mn*mn?m的網(wǎng)格上放置2n2n2n個炮,要求互不能攻擊。
數(shù)據(jù)滿足n≤m≤2000n\leq m\leq 2000n≤m≤2000或n≤m≤105n\leq m\leq 10^5n≤m≤105且m?n≤10m-n\leq 10m?n≤10
解題思路
每行每列最多222個炮,所以模型可以轉換為求有多少種方案滿足:1~n1\sim n1~n的數(shù)字各兩個填在mmm個無序2元組(可以有空),并且每個組中的數(shù)互不相同。
直接硬鋼推式子很難做(好像可以推到生成函數(shù)那邊去),考慮一下巧妙的方法。
設g(n,m)g(n,m)g(n,m)表示2n2n2n個格子填下1~m1\sim m1~m中的數(shù)字各兩個的方案。這個的方案就是
g(n,m)=(2n)!∑i=0min{n,m?n}(mn?i)(m?n+i2i)2n?ig(n,m)=(2n)!\sum_{i=0}^{min\{n,m-n\}}\frac{\binom{m}{n-i}\binom{m-n+i}{2i}}{2^{n-i}}g(n,m)=(2n)!i=0∑min{n,m?n}?2n?i(n?im?)(2im?n+i?)?
表示mmm個數(shù)組中選出n?in-in?i對相同的來填,剩下的里面選出2i2i2i個單獨的來填,然后交換導致重復的情況有2n?i2^{n-i}2n?i種,要除去。
這個式子就和m?nm-nm?n有很大的關系了。
將這個式子和答案聯(lián)系起來,設f(n,m)f(n,m)f(n,m)表示答案,那么有
g(n,m)=∑i=0n2n?i(ni)Pmif(n?i,m?i)g(n,m)=\sum_{i=0}^n2^{n-i}\binom{n}{i}P_{m}^if(n-i,m-i)g(n,m)=i=0∑n?2n?i(in?)Pmi?f(n?i,m?i)
因為f(n,m)f(n,m)f(n,m)是不同無序二元組,(ni)Pmi\binom{n}{i}P_{m}^i(in?)Pmi?表示nnn對中選出iii個是相同的填入,剩下的都是不同的方案就是f(n?i,m?i)f(n-i,m-i)f(n?i,m?i),然后因為ggg是統(tǒng)計有序二元組的,所以2n2^n2n表示隨意交換。
2nf(n,m)=∑i=0n(ni)Pmig(n?i,m?i)2^{n}f(n,m)=\sum_{i=0}^n\binom{n}{i}P_{m}^ig(n-i,m-i)2nf(n,m)=i=0∑n?(in?)Pmi?g(n?i,m?i)
f(n,m)=12n∑i=0n(ni)Pmig(n?i,m?i)f(n,m)=\frac{1}{2^n}\sum_{i=0}^n\binom{n}{i}P_{m}^ig(n-i,m-i)f(n,m)=2n1?i=0∑n?(in?)Pmi?g(n?i,m?i)
然后直接計算就好了,時間復雜度O(n×min{n,m?n})O(n\times min\{n,m-n\})O(n×min{n,m?n})
Update:Update:Update:修改了反演前的公式錯誤
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=2e5+10,P=998244353,inv2=(P+1)/2; ll n,m,fac[N],inv[N],pv2[N],ans; 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; } ll C(ll n,ll m) {return fac[n]*inv[m]%P*inv[n-m]%P;} ll A(ll n,ll m) {return fac[n]*inv[n-m]%P;} ll g(ll n,ll m){ll ans=0;for(ll i=0;i<=min(n,m-n);i++)(ans+=C(m,n-i)*C(m-n+i,2*i)%P*pv2[n-i]%P)%=P;return ans*fac[2*n]%P; } signed main() {scanf("%lld%lld",&n,&m);inv[1]=1;for(ll i=2;i<N;i++)inv[i]=P-(P/i)*inv[P%i]%P;fac[0]=inv[0]=pv2[0]=1;for(ll i=1;i<N;i++)fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P,pv2[i]=pv2[i-1]*inv2%P;for(ll i=0,p=1;i<=n;i++,p=-p)(ans+=p*(g(n-i,m-i)*C(n,i)%P*A(m,i)%P))%=P;printf("%lld\n",(ans*pv2[n]%P+P)%P);return 0; }總結
以上是生活随笔為你收集整理的P4831-Scarlet loves WenHuaKe【组合数学】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旧路由器如何重新设置用过的路由器怎么重新
- 下一篇: 如果你使用华为手机如果华华为手机