日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces - 1312D Count the Arrays(组合数学)

發(fā)布時(shí)間:2024/4/11 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1312D Count the Arrays(组合数学) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(diǎn)擊查看

題目大意:給出一個(gè) n 和 m ,求滿足條件的數(shù)組有多少個(gè)

  • 數(shù)組包含 n 個(gè)元素
  • 每個(gè)元素的取值為 1 ~ m
  • 包含且僅包含一對(duì)相同的元素
  • 存在一個(gè)位置 pos ,使得 [ 1 , pos ] 內(nèi)嚴(yán)格遞增,[ pos , n ] 內(nèi)嚴(yán)格遞減
  • 題目分析:讀完題后不難看出是一道排列組合的題目,本著先選數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。