C - Glenbow Museum(UVALive-4123 ,组合,白皮书)

C - Glenbow Museum

UVALive - 4123

题意:

对于一个边平行于坐标轴的多边形,我们可以用一个由R或者O组成的序列来描述他,从一个顶点开始按照逆时针顺序走,碰到一个90°的内角记作R;碰到一个270°的内角记作O。这样的序列称为角度序列。

给定正整数L,有多少个长度为L的角度序列至少可以对应一个星形多边形(即多边形中存在一个点,可以看到多边形边界上的每一个点)?多边形的每条边长度任意。注意一个多边形有多条角度序列与之对应,RRORRR与ORRRRR是不同序列,但可以描述同一个多边形。

输入描述:

输入包含多组数据,每组数据仅占一行,即角度序列的长度L(1<=L<=1000)输入结束标志(L=0)

输出描述:

对于每组数据,输出满足条件的角度序列的个数。

分析:

​ 长度为L的多边形的内角和是一定的,且270°的内角与90°的内角的个数是恒定为L。所以设90°的个数为x个,270°的个数为y个。

x+y=Lx+y=Lx+y=L

90∗x+270∗x=(L−2)∗18090*x+270*x=(L-2)*18090x+270x=(L2)180

解得

x=(l+4)/2x=(l+4)/2x=(l+4)/2

y=(l−4)/2y=(l-4)/2y=(l4)/2

故可知 90°的序列比270°的多4个,且L必须为偶数,且L >=4

还有那些限制条件呢?

题目描述的形状由上 下 左 右 四条边,即由4个RR的连续的串, 且OO不能连在一起,最左边是O,最右边是O也不行

那么可以用插空法

1.最左(右)边是O的方法数目 C(x-1,y-1)

2.左右两边有没有O的方法数目 C(x-1,y )

故答案 ans=C(x−1,y−1)∗2+C(x−1,y)ans=C(x-1,y-1)*2+C(x-1,y)ans=C(x1,y1)2+C(x1,y)

#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<cstring>
#include<string>
#include<iostream>
#include<iomanip>
#define mset(a,b)   memset(a,b,sizeof(a))
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxn=10000;
const int branch=26;
const int inf=0x3f3f3f3f;
const int MOD=1e6+7;
ull l;
int main()
{
    ull ans;
    int kcas=0;
    while(cin>>l,l)
    {
        if(l<=3||l&1)
        {
            ans=0;
        }
        else
        {
            ull x=(l+4)/2;
            ans=(x*(x-1)*(x-2)*(x-3))/24+((x-1)*(x-2)*(x-3)*(x-4))/24;
        }
        printf("Case %d: ",++kcas);
        cout<<ans<<endl;

    }
    return 0;
}

转载于:https://www.cnblogs.com/dchnzlh/p/10427279.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值