cogs184搭建篱笆

勤奋的农夫约翰想要修建一个4面的篱笆墙把他的奶牛们围起来。他有一块长为N的木板 4<=N<=2500 于是他想要在三个点把他们切断用以得到4块木板。

只要能构成成四边形篱笆,这4块板子的长度可以是任意正整数。那么为了得到完整的篱笆农夫约翰有多少不同的种方法切这个长木板呢?

注意:

  • 对于两种方案而言,只要一方存在一个另一方没有的切割点,那它们就将视为不同的方案。不必担心对称或那个其他复杂的情况的排除。

  • 请注意,篱笆所围的面积应当大于0。
  • 你将高兴的是,我们保证答案适合有符号的32位整型变量。

分数:250

问题名称:quad

输入格式:

  • 第1行:一个单独的整数:N

输入样例(file quad.in):

6

输入说明:这个板子的长度是6。

输出格式:

  • 第1行:一个单独的整数表示切割方案数。

输出样例:

6

输出说明:

农夫约翰有10种方法切割木板:

(1,1,1,3);(1,1,2,2);(1,1,3,1);(1,2,1,2);(1,2,2,1);

(1,3,1,1);(2,1,1,2);(2,1,2,1);(2,2,1,1);(3,1,1,1).

但是其中的4种-- (1,1,1,3),(1,1,3,1),(1,3,1,1),(3,1,1,1)

是不能构成篱笆的。

题解:

考虑取四个板子的情况 显然是C(n-1,3)(切3刀 就剩下4个板子)

考虑不合法的情况:有一个板子的长度d>=(n+1)/2

当已经截取一个这样的板子 剩下的板子就是在n-d长度的板子上切2刀得到的

那么不合法情况就是∑(i=(n+1)/2,n)C(n-i-1,2)*A(4,1);

代码:

#include<cstdio>    
using namespace std;  
int main(){  
    long long n,m;  
    freopen("quad.in","r",stdin);  
    freopen("quad.out","w",stdout);  
    scanf("%lld",&n);
    long long ans=(n-1)*(n-2)*(n-3)/6; 
	m=(n+1)/2;	
    for(long long i=m;i<=n-3;i++) 
		ans-=(n-i-1)*(n-i-2)*2;  
    printf("%lld\n",ans);  
return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值