1. 程式人生 > >4123 && ALGO-165 Glenbow Museum(排列組合)

4123 && ALGO-165 Glenbow Museum(排列組合)

題目連結:http://lx.lanqiao.cn/problem.page?gpid=T461點選開啟連結

演算法訓練 Glenbow Museum   時間限制:1.0s   記憶體限制:256.0MB 問題描述   卡城著名的格林堡博物館是加拿大西部最大的博物館,展品涵蓋了藝術、文化史以及礦物學。如今一個全新的展區正在被佈置,它是專門為你這樣傑出的程式猿(媛)打造的。不幸的是,由於空間不足,博物館打算建造一棟新的建築來重新安置這個展區。
  新的建築的尺寸和容量將不同於原始的建築,但是所有樓層的設計都是直角多邊形。一個直角多邊形是內角均為90°或270°的多邊形。如果我們記90°角為R(Right)、270°角為O(Obtuse),那麼一個只包含R和O的字串能夠粗略的表示一個直角多邊形。比如,一個矩形(圖形1)就是最簡單的直角多邊形,它能夠用RRRR來描述(內角按逆時針排列,起始角任意)。同樣地,一個十字形直角多邊形(圖形2)能夠用RRORRORRORRO、RORRORRORROR或者ORRORRORRORR來描述。這些序列被稱為角序列。





  當然,一個角序列不一定能完全對應一個形狀的多邊形,因為它沒有說明邊長。並且一個角序列不一定能描述一個合法的直角多邊形(比如RRROR)。
  為了把事情搞得更麻煩,博物館並不接受所有的樓層設計。一個博物館儲存了許多價值連城的物品,它們必須要被看守著。出於對成本的考慮,一個樓層最多隻能有一個保安。所以只有滿足以下要求的樓層設計能被接受:存在一個地點使得一個保安能監視到整個樓層。因此一個角序列能被接受,當且僅當它描述了一個能夠被接受的多邊形。注意圖形2的十字形直角多邊形能夠被站在中心的保安完全監視,所以它是被接受的,因此角序列RRORRORRORRO是被接受的,即使它也能夠描述其他不能被一個保安監視的多邊形。
  請幫助新建築的設計師確定有多少給定長度的能夠被接受的角序列。 輸入格式   輸入檔案包含多組測試資料。每組資料一行,包含一個正整數 L (1 <= L <= 1000),表示給定的角序列長度。
  輸入檔案以僅包含0的一行結束。 輸出格式   對於每一組資料,輸出一行,包含測試資料編號(從1開始),之後為給定長度的被接受的角序列的個數。具體格式參考樣例輸出。 樣例輸入 4
6
0 樣例輸出 Case 1: 1
Case 2: 6 資料規模和約定   按題目描述所示。

題目大意是讓你求能夠描述符合條件的直角多邊形的個數 條件是 O角+4=R角個數 且所描述的序列不能出現重複的O(根據題意的視角描述可知)

據說是lrj數上的原題 用遞推寫的

除了遞推 也可以使用排列組合的方式寫

根據條件 知道了你需要構造一個R的個數是O的個數+4 並且所形成的的這個字串的環中不能存在連續的兩個O

這樣一來就是一串連續的R中間插入 R的個數-4 個O 並且要求頭尾不能同時存在

如此一來就很容易算了

另外由於C中的m和n有數量關係 因此不需要具體執行細節的階乘

(評測系統為藍橋杯系統)

#include <bits/stdc++.h>
using namespace std;
long long int C(long long int m)
{
	long long int sum=1;
	for(int i=m-4;i<=m;i++)
		sum*=i;
	return sum/120;
}
long long int judge(long long int n)
{
	if(n<4||n&1)
		return 0;
	return C(4+(n-4)/2+1)-C(4+(n-4)/2+1-2);
}
int main()
{
	long long int n;
	int cnt=1;
	while(cin >> n&&n)
	{
		cout << "Case "<< cnt << ": " << judge(n) << endl;
		cnt++;
	}
}