有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 個英...