勤奮的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份