bzoj1600(排列組合)

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

發佈了331 篇原創文章 · 獲贊 17 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章