CodeForces - 1312D Count the Arrays(组合数学)
題目鏈接:點(diǎn)擊查看
題目大意:給出一個(gè) n 和 m ,求滿足條件的數(shù)組有多少個(gè)
題目分析:讀完題后不難看出是一道排列組合的題目,本著先選數(shù),再排序的原則,我們一步步分析
首先我們需要選出 n 個(gè)元素才能構(gòu)成一個(gè)數(shù)組,因?yàn)樾枰幸粚?duì)相同的元素,因此這里我們暫時(shí)只需要選出 n - 1 個(gè)元素就足夠了,共 C( m , n - 1 ) 種情況,因?yàn)轭}目中需要保證在 pos 位置的兩側(cè)嚴(yán)格遞增或遞減,那么說明最大值是唯一的,此時(shí)在已經(jīng)選出的?n - 1 個(gè)元素中,減去一個(gè)最大值,還剩 n - 2 個(gè)元素可以重復(fù)一遍,滿足題目中的第三個(gè)條件,到這一步為止,我們已經(jīng)處理完了選數(shù)的問題,也就是 C( m , n - 1 ) * ( n -?2 ) 種選取方案
接下來需要分析順序問題,相對(duì)于選數(shù)問題來說,順序可能稍微有一丟丟難度,不過一步一步來還是問題不大的,首先我們現(xiàn)在已經(jīng)選出了?n 個(gè)滿足前三個(gè)條件的元素了,因?yàn)闈M足嚴(yán)格遞增和嚴(yán)格遞減的限制,所以重復(fù)的那個(gè)數(shù),以及最大值,這三個(gè)數(shù)的相對(duì)位置都是固定不變的,一定滿足最大值位于最中間,而重復(fù)的兩個(gè)值分別位于兩側(cè),其他的 n - 3 個(gè)數(shù)可能會(huì)如何分布呢,無非是在最大值的左側(cè)或右側(cè)兩種情況,我們可以發(fā)現(xiàn),如果這 n - 3 個(gè)數(shù)在左側(cè)或右側(cè)的情況固定下來之后,因?yàn)轭}目中第四個(gè)條件的限制,數(shù)組的順序也隨之固定下來了,且是唯一的,這樣關(guān)于順序的方案數(shù)也就呼之欲出了:pow( 2 , n - 3 )
其實(shí)看題解的話這個(gè)題目的難度并不是很大,我感覺難就難在,考慮順序的時(shí)候,可能會(huì)陷入如何分配最大值的位置的陷阱中去,也就是從絕對(duì)位置的方向出發(fā),從而越走越偏,其實(shí)不然,因?yàn)槿绻紤]絕對(duì)位置的話會(huì)使題目復(fù)雜化,所以我們不妨從相對(duì)位置下手,會(huì)起到事半功倍的效果
實(shí)現(xiàn)代碼的話也沒什么難度,需要用到的數(shù)論知識(shí)就是關(guān)于逆元的求法了,因?yàn)榻M合數(shù)涉及到了取模以及除法,而給出的模數(shù)是一個(gè)質(zhì)數(shù),所以直接費(fèi)馬小定理求逆元然后亂搞就好了
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;const int mod=998244353;LL q_pow(LL a,LL b) {if(b<0)return 0;LL ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans; }LL C(int n,int m) {LL ans1=1;//分子 LL ans2=1;//分母 for(int i=0;i<m;i++){ans1=ans1*(n-i)%mod;ans2=ans2*(i+1)%mod;}ans2=q_pow(ans2,mod-2);return ans1*ans2%mod; } //C(m,n-1)*(n-2)*pow(2,n-3); int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);printf("%lld\n",C(m,n-1)*(n-2)%mod*q_pow(2,n-3)%mod);return 0; }?
總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1312D Count the Arrays(组合数学)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CodeForces - 1312C A
- 下一篇: CodeForces - 1312E A