哈,我的第一道母函数题目。
题意:一个由1~N 组成的集合,问将这个集合分成俩个子集,使得俩个子集的和相等的方法数。、
分析:分成俩个子集,子集的和相等,很明显,子集的和已经知道了。换种说法,就是求用1~N 这个数组合出和为(1+N)*N/4 方法数的一半。
这就用到 母函数的思想,求出函数(1+x)*(1+x^2)*(1+x^3)……(1+x^N)的展开式中,指数为 (1+N)*N/4 的项的系数。
/*
ID: nanke691
LANG: C++
TASK: subset
*/
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
long long num[800],num1[800];
int n;
void solve(int s)
{
memset(num,0,sizeof(num));
memset(num1,0,sizeof(num));
num[1]=num1[1]=1;
num[0]=num1[0]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<=i*(i+1)/2;j++)
if(num[j]!=0)
{
num1[j+i]+=num[j];
}
for(int j=0;j<=i*(i+1)/2;j++)
num[j]=num1[j];
}
cout<<num1[s]/2<<endl;
}
int main()
{
freopen("subset.in","r",stdin);
freopen("subset.out","w",stdout);
cin>>n;
int sum=(n+n*n)/2;
if(sum%2!=0)
cout<<0<<endl;
else solve(sum/2);
}