USACO 2.2.2 Subset Sums

题意为将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;
}
		


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值