P6672-[清华集训2016]你的生命已如风中残烛【结论】
正題
題目鏈接:https://www.luogu.com.cn/problem/P6672
題目大意
長度為mmm的序列aaa,有nnn個數字不是000,其他m?nm-nm?n個是000。要求重排后有多少方案滿足
?x,∑i=1xai≥i\forall x,\sum_{i=1}^xa_i\geq i?x,i=1∑x?ai?≥i
其中m=∑i=1naim=\sum_{i=1}^{n}a_im=∑i=1n?ai?
1≤n≤40,1≤ai≤1051\leq n\leq 40,1\leq a_i\leq 10^51≤n≤40,1≤ai?≤105
解題思路
具體數學P301頁有一個ReneyReneyReney引理(雖然我還沒看到):
假設一個整數序列何為111,那么它的所有循環位移中有且僅有一個滿足所有的前綴和為+1+1+1
然后考慮這題,都減去一的話就是要求都為非負了,而且所有數的和為000。
怎么轉換成上面那種情況,加一個進去111的話不是很行,因為有很多正數所以我們不能保證這個111排在最前面。
反著考慮,把所有數取反再加一個111的話就可以了,因為這樣正數就只有111了。
所以的話它的圓排列個數就是m!m!m!個了,但是多了一個?1-1?1我們要減去這個?1-1?1的影響,其實就是多塞一個?1-1?1進去的話,就是多了m?n+1m-n+1m?n+1個了。所以答案就是
m!m?n+1\frac{m!}{m-n+1}m?n+1m!?
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll P=998244353; ll n,m,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; } signed main() {scanf("%lld",&n);for(ll i=1;i<=n;i++){ll x;scanf("%lld",&x);m+=x;}ans=1;for(ll i=1;i<=m;i++)ans=ans*i%P;printf("%lld\n",ans*power(m-n+1,P-2)%P);return 0; }總結
以上是生活随笔為你收集整理的P6672-[清华集训2016]你的生命已如风中残烛【结论】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 制矩形选区怎么填充颜色(如何更改矩形选区
- 下一篇: P5934-[清华集训2012]最小生成