题意为将1~n分割为和相等的两块。等价为用1~n凑出和为n(n+1)/4的序列,不得重复。
即将n(n+1)/4拆分成最大为n的正整数。
整数拆分问题较简便的方法为母函数法,参见http://blog.chinaunix.net/uid-26548237-id-3503956.html
此题中即要求q(n(n+1)/4,n)。
【USACO中输出64位整数必须用%lld。用%I64d的后果就是在输出结果前拖上64条下划线- -】
/*
ID:szwjcch971
LANG:C++
TASK:subset
*/
#include "stdio.h"
#include "string.h"
int main(){
long long sum,n,i,j,k;
long long xishu[80000];
FILE *fin=fopen("subset.in","r");
FILE *fout=fopen("subset.out","w");
fscanf(fin,"%d",&n);
if((n%4==1)||(n%4==2))fprintf(fout,"0\n");
else{
memset(xishu,0,sizeof(xishu));
sum=n*(n+1)/4;
xishu[0]=xishu[1]=1;
for(i=2;i<=n;i++){
for(j=i*(i-1)/2;j>=0;j--){
xishu[i+j]+=xishu[j];
}
}
//fprintf(fout,"n=%d , sum=%d.\n",n,sum);
fprintf(fout,"%lld\n",xishu[sum]/2);
}
return 0;
}