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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【NOIP2013模拟】粉刷匠 题解代码

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NOIP2013模拟】粉刷匠 题解代码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原題

Description

赫克托是一個(gè)魁梧的粉刷匠,而且非常喜歡思考= =

現(xiàn)在,神廟里有N根排列成一直線的石柱,從1到N標(biāo)號,長老要求用油漆將這些石柱重新粉刷一遍。赫克托有K桶顏色各不相同的油漆,第i桶油漆恰好可以粉刷Ci根石柱,并且,C1+C2+C3…CK=N(即粉刷N根石柱正好用完所有的油漆)。長老為了刁難赫克托,要求相鄰的石柱顏色不能相同。

喜歡思考的赫克托不僅沒有立刻開始粉刷,反而開始琢磨一些奇怪的問題,比如,一共有多少種粉刷的方案?

為了讓赫克托盡快開始粉刷,請你盡快告訴他答案。

Input

第一行一個(gè)正整數(shù)T,表示測試數(shù)據(jù)組數(shù)

對于每一組測試數(shù)據(jù)數(shù)據(jù):

第1行:一個(gè)正整數(shù)K

第2行:K個(gè)正整數(shù),表示第i桶油漆可以粉刷的石柱個(gè)數(shù),Ci。

Output

對于每組輸入數(shù)據(jù),輸出一行一個(gè)整數(shù),表示粉刷的方案數(shù)mod 1000000007。

Sample Input

3

3

1 2 3

5

2 2 2 2 2

10

1 1 2 2 3 3 4 4 5 5

Sample Output

10

39480

85937576

Data Constraint

30% N10,T5

50% N15,T5

80% K15,Ci5,T500

100% K15,Ci6,T2000

題解

  • 每一步處理一種顏色。

  • 設(shè) F[i][j] 表示涂到第i種顏色,有j對相鄰的柱子顏色相同。

  • 記涂到第i種顏色之后一共有 S 塊。

  • 對于 i+1 這種顏色,能粉刷 A 次。

  • 設(shè)把這種顏色分成 k 塊,插進(jìn)序列里面。

  • 插進(jìn)的位置中,有 l 個(gè)位置剛好插進(jìn)在j對顏色相同的柱子中間( lj 且 lk )。

  • 新狀態(tài)的 j:原有的 j,新增的 A?k,減少的 l

  • 狀態(tài)轉(zhuǎn)移:

  • 把顏色分成 k 塊的方案數(shù):C(A?1,k?1)

  • 把塊插進(jìn) l 個(gè)位置的方案數(shù):C(j,l)

  • 剩余塊的處理方式:C(S+1?j,k?l)

  • 轉(zhuǎn)移方程如下:

  • F[i+1][j+A?k?l]+=F[i][j]?C(j,l)?C(A?1,k?1)?C(S+1?j,k?l)

  • 時(shí)間復(fù)雜度O(K?N?C?C?T)。(理論復(fù)雜度與上一解法一致)

優(yōu)化

  • 我們看到 T=2000 這一條件極不和諧。

  • 慶幸的是,將每個(gè)詢問內(nèi)的數(shù)字打亂順序不影響答案。

  • 我們可以將每個(gè)詢問內(nèi)部進(jìn)行排序,再按字典序排序之后再處理,順序處理。

  • 處理詢問 i+1 時(shí),保留處理i時(shí)的f值。

  • 若詢問i與 i+1 的詢問前x個(gè)數(shù)都相等,則對于x之前的f值都是相等的。

  • 由于按字典序排序了,順序處理會(huì)減少大多數(shù)的處理。

Code

#include<cstdio> #include<cstring> using namespace std; const int mo=1e9+7,N=91; long long f[N][N],c[N][N]; inline int read() {int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data; } int main() {c[0][0]=1;for(int i=1;i<N;i++){c[i][i]=c[i][0]=1;for(int j=1;j<i;j++) c[i][j]=c[i-1][j]+c[i-1][j-1];}int T=read();while(T--){int n=read(),m=0;memset(f,0,sizeof(f));f[0][0]=1;for(int i=1;i<=n;i++){int x=read();for(int j=0;j<=m;j++)if(f[i-1][j])for(int k=1;k<=x;k++){int y=(x<j)?x:j;for(int l=0;l<=y;l++)f[i][j-l+x-k]=(f[i][j-l+x-k]+f[i-1][j]*c[x-1][k-1]*c[j][l]%mo*c[m-j+1][k-l])%mo;}m+=x;}printf("%lld\n",f[n][0]);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的【NOIP2013模拟】粉刷匠 题解代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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