新的建筑的尺寸和容量将不同于原始的建筑,但是所有楼层的设计都是直角多边形。一个直角多边形是内角均为90°或270°的多边形。如果我们记90°角为R(Right)、270°角为O(Obtuse),那么一个只包含R和O的字符串能够粗略的表示一个直角多边形。比如,一个矩形(图形1)就是最简单的直角多边形,它能够用RRRR来描述(内角按逆时针排列,起始角任意)。同样地,一个十字形直角多边形(图形2)能够用RRORRORRORRO、RORRORRORROR或者ORRORRORRORR来描述。这些序列被称为角序列。
当然,一个角序列不一定能完全对应一个形状的多边形,因为它没有说明边长。并且一个角序列不一定能描述一个合法的直角多边形(比如RRROR)。
为了把事情搞得更麻烦,博物馆并不接受所有的楼层设计。一个博物馆保存了许多价值连城的物品,它们必须要被看守着。出于对成本的考虑,一个楼层最多只能有一个保安。所以只有满足以下要求的楼层设计能被接受:存在一个地点使得一个保安能监视到整个楼层。因此一个角序列能被接受,当且仅当它描述了一个能够被接受的多边形。注意图形2的十字形直角多边形能够被站在中心的保安完全监视,所以它是被接受的,因此角序列RRORRORRORRO是被接受的,即使它也能够描述其他不能被一个保安监视的多边形。
请帮助新建筑的设计师确定有多少给定长度的能够被接受的角序列。
输入文件以仅包含0的一行结束。
6
0
Case 2: 6
按题目描述所示。
具体要求就是O不能连放,而且想要满足条件,我们需要保证只有4个O即可.这样保证向内,能够完全检测到。
对于n序列,我们可以有(n+4)/2个R,设为Y。 我们设
我们有两种方法。
第一个就是1,3,5,7,9这样固定R,往中间插入O, 即C(Y,4)。
第二种是我们在1号位置放了O,那么最后一个位置必须为R。所以C(Y-1,4)。这里放4是因为1号位置不确定放哪个。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
long long C(long long n,long long m)
{
long long i;
long long a=1,b=1;
if(m > n/2)
m = n-m;
for(i=m; i>0; i--)
{
a *= n;
n--;
b *= i;
}
return (a/b);
}
int main()
{
long long sum;
long long n;
long long u=0;
while(cin>>n&&n!=0)
{
if(n<4||n%2==1)
{
sum=0;
}
else if(n==4)
{
sum=1;;
}
else
{
long long R=(n+4)/2;
long long O=n-R;
sum=C(R,4)+C(R-1,3);
}
u++;
cout << "Case "<< u << ": ";
cout<<sum<<endl;
}
}