勤奋的Farmer John想要建造一个四面的栅栏来关住牛们。他有一块长为n(4<=n<=2500)的木板,他想把这块本板切成4块。这四块小木板可以是任何一个长度只要Farmer John能够把它们围成一个合理的四边形。他能够切出多少种不同的合理方案。注意: *只要大木板的切割点不同就当成是不同的方案(像全排列那样),不要担心另外的特殊情况,go ahead。 *栅栏的面积要大于0. *输出保证答案在longint范围内。 *整块木板都要用完。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=2505;
ll C[N][5];
int n;
void init()
{
C[0][0]=1;
for (int i=1;i<=2500;i++)
{
C[i][0]=1;
for (int j=1;j<=3;j++) C[i][j]=C[i-1][j]+C[i-1][j-1];
}
}
int main()
{
init();
scanf("%d",&n);
ll ans=0;
ans=C[n-1][3];
for (int i=(n+1)/2;i<n;i++) ans-=C[n-i-1][2]*4;
printf("%lld",ans);
return 0;
}
总结
1.题目中说,最后答案在int内,实际上中间变量是可能会爆int的。所以这里还是要开ll的
2.注意排列组合的经典题型。
例如此题:把一个长度为n的木板,分成k份,就是在这n-1个空中选择k-1个分割符。由此分为k份