Description
有一位著名的数学家,叫Yushi,他提出了一个世纪难题:
给定一个正整数N,由1,2……,N组成的集合
S0={1,2,3,……,N}
对于任意给定的集合,定义集合的和为集合中所有元素的和。
集合S0可以被划分为两个不相交的子集合S1,S2。分别对这两个集合求和,如果两个集合的和相差恰好为K,则记为一种合法的划分方法。考虑N=7,K=0,则合法划分方法一种有4种:{1,2,4,7},{3,5,6};{1,2,5,6},{3,4,7};{1,6,7},{2,3,4,5};{1,3,4,6},{2,5,7}
对于给定的N和K,求出集合的划分方法总数。
Input
仅含一行,两个整数N(1<N<32)和K(0<=K<=100000000)。
Output
仅含有一个数,表示划分集合的合法方案数。
Sample Input
7 0
- Sample Output
4
#include<iostream>
using namespace std;
int main()
{
int N,k,i,j,a,s;
int f[500]={1,1};
while(scanf("%d%d",&N,&k)!=EOF)
{
memset(f,0,sizeof(f));
s=N*(N+1)/2;
f[1]=f[0]=1;
if(k>=s||(s+k)%2==1)
printf("0\n");
else
{
a=(s+k)/2;
for(i=2;i<=N;i++)
for(j=a;j>=i;j--)
f[j]=f[j]+f[j-i];
if(!k)
f[a]/=2;
printf("%d\n",f[a]);
}
}
return 0;
}