BZOJ-1600: [Usaco2008 Oct]建造栅栏

[文章目录]

Description

勤奋的Farmer John想要建造一个四面的栅栏来关住牛们。他有一块长为n(4<=n<=2500)的木板,他想把这块本板切成4块。这四块小木板可以是任何一个长度只要Farmer John能够把它们围成一个合理的四边形。他能够切出多少种不同的合理方案。注意: *只要大木板的切割点不同就当成是不同的方案(像全排列那样),不要担心另外的特殊情况,go ahead。 *栅栏的面积要大于0. *输出保证答案在longint范围内。 *整块木板都要用完。

正难则反,统计出全部情况再减去不存在的情况。
全部情况就是n-1个位置放3个隔板,,然后减去非法情况:有长度超过n/2的板子的情况。可以先固定一个砍的位置,然后其他可以砍的位置只能是距离改为值超过n/2的位置。统计一下呗。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long ans,C[2510][7];
int n;

int main()
{
    scanf("%d",&n);
    C[0][0]=1; int i,j;
    for(i=1;i<=n;++i)
    {
        C[i][0]=1;
        for(j=1;j<=min(i,4);++j)
            C[i][j]=C[i-1][j]+C[i-1][j-1];
    }
    ans=C[n-1][3]; int tmp=(n+1)>>1;
    ans-=C[n-tmp][3];
    ans-=1ll*C[n-tmp-1][2]*(n-tmp);
    printf("%lld",ans);
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注