Yushi难题

  1. 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值