粉刷匠 集體照

2021-07-12 03:52:01 字數 1663 閱讀 3723

有m個種類的球,第i個種類有r[i]個球,把球排成一行是使得相鄰兩個球種類不同,問方案數。

我們可以乙個種類乙個種類的放球。

兩個球中間以及最前最後都有「空」。

定義非法空指該空兩端是同色球,合法空反之。

設f[i,j]表示當前做到種類i,有j個合法空。此時有個sum表示空的總數。

我們可以列舉這r[i]個球放去k個合法空中與l個非法空中,那麼 f[

i,r[

i]+j

−k−l

∗2]+

=f[i

,j]∗

cksu

m−j∗

clj∗

ck+l

−1r[

i]−1

最後乙個組合數很好理解,就是r[i]個球分成k+l份,每份至少為1。

至於r[i]+j-k-l*2是怎麼來的,也很好理解,插入到l個非法空就會減少l個非法空,然後每個空都放乙個還會遺留下r[i]-(k+l)個球,這些球每個無論怎麼放都會增加乙個非法空,於是新的非法空個數為r[i]-(k+l)-l+j=r[i]+j-k-l*2

粉刷匠**:

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

using namespace std;

typedef long long ll;

const int maxm=15+10,maxn=90+50,mo=1000000007;

int f[maxm][maxn],comb[maxn][maxn],r[maxm];

int i,j,k,l,up1,up2,t,n,m,sum,ca;

intread()

returnx;}

int main()

ca=read();

while (ca--)

}sum+=r[i];

}printf("%d\n",f[m+1][0]);

}}

集體照**

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fd(i,a,b) for(i=a;i>=b;i--)

#define werkeytom_ftd main

using namespace std;

typedef long long ll;

const ll mo=1000000007;

ll f[110][3010],g[105],ff[3010],gg[3010];

ll i,j,k,l,t,n,m,a,b,d,sum,ans;

ll quicksortmi(ll x,ll y)

bool cmp(int

x,int

y)ll comb(ll x,ll y)

int werkeytom_ftd()

sum+=g[i+1];

}ans=f[n][0];

fo(i,1,n) ans=ans*ff[g[i]]%mo;

printf("%lld\n",ans);

fclose(stdin);fclose(stdout);

return

0;}

PAT 乙級 集體照

拍集體照時隊形很重要,這裡對給定的 n 個人 k 排的隊形設計排隊規則如下 現給定一組拍照人,請編寫程式輸出他們的隊形。輸入格式 每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 n 10 4 總人數 和 k 10,總排數 隨後 n 行,每行給出乙個人的名字 不包含空格 長度不超過...

PTA 集體照 25分

拍集體照時隊形很重要,這裡對給定的 n 個人 k 排的隊形設計排隊規則如下 現給定一組拍照人,請編寫程式輸出他們的隊形。每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 n 10 4 總人數 和 k 10,總排數 隨後 n 行,每行給出乙個人的名字 不包含空格 長度不超過 8 個英...

1055 集體照 (25 分)

拍集體照時隊形很重要,這裡對給定的 n 個人 k 排的隊形設計排隊規則如下 現給定一組拍照人,請編寫程式輸出他們的隊形。每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 n 10 4 總人數 和 k 10,總排數 隨後 n 行,每行給出乙個人的名字 不包含空格 長度不超過 8 個英...