哈,我的第一道母函数题目。
题意:一个由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); }