3745 - 集合划分
时间限制 : 1 秒
内存限制 : 128 MB
对于从1到N(1<=N<=39)的连续整数集合,划分成两个子集合,使得每个集合的数字之和相等。
举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:{3} and {1,2}
这是唯一的一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)。
如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分法的子集合各数字和是相等的:
{1,6,7} and {2,3,4,5};{2,5,7} and {1,3,4,6};
{3,4,7} and {1,2,5,6};{1,2,4,7} and {3,5,6}
题目输入
一个正整数N,1<=N<=39
题目输出
一个数,划分集合的方法数。
输入/输出样例
输入格式
7
输出格式
4
C++解答
#include<cstdio> #include<cstring> #define clr(x)memset(x,0,sizeof(x)) long long f[50000]; int main() { long long n,i,j,v; while(scanf("%lld",&n)!=EOF) { if(n==0) break; v=n*(n+1)/2; if(v%2==1) { printf("0\n"); continue; } clr(f); f[0]=1; v/=2; for(i=1;i<=n;i++) for(j=v;j>=i;j--) f[j]+=f[j-i]; printf("%lld\n",f[v]/2); } return 0; }