测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A44147. 求和比较

填空题 困难

题目描述

求和比较

题目描述

小蓝在学习C++数组时,突发奇想想知道如果将一个连续的正整数数组拆分成两个子数组,然后对拆分出的两个子数组求和并做差,且差值正好等于一个固定的正整数,像这样同一连续的正整数数组拆分方案有多少种。

我们一起帮助小蓝设计一下规则:

第一给出两个正整数N和M;

第二从1到N组成一个连续正整数数组A(A={1,2,3,4……N});

第三将数组A拆分成两个子数组A1、A2(1.两个子数组中不能出现相同的数;2.子数组中的数字可以是连续的也可以是不连续的;3.拆分出的两组子数组的元素个数可以不同,但总数量等于A数组元素个数);

第四对A1、A2两个子数组分别求和;

第五对A1、A2两个子数组的和做差(大的数字减去小的数字);

第六如果差值正好等于固定值M,则判定此拆分方案成立。


如:N=5,M=1,连续正整数数组A={1, 2, 3, 4, 5}。

符合条件的拆分方案有3种:


A1={1, 2, 4}, A2={3, 5}, 其中A1的和为7,A2的和为8,和的差值等于1

A1={1, 3, 4}, A2={2, 5}, 其中A1的和为8,A2的和为7,和的差值等于1

A1={3, 4}, A2={1, 2, 5}, 其中A1的和为7,A2的和为8,和的差值等于1


输入格式

输入两个正整数N和M(3<N<30,0<=M<=500)

输出格式

输出拆分方案数。

样例输入

5 1

样例输出

3

参考答案

#include <iostream> #include <cstdio> using namespace std; int f[35][35]; int main() { int n,m; cin>>n>>m; int sum=0; for(int i=1;i<=n;i++)sum+=i; sum-=m; if(sum%2!=0||sum<0){ cout<<0<<endl;return 0; } /*设x为A1的和 设y为A2的和 则有:x+y=sum y-x=m 则:x=(sum-m)/2 y=x+m */ int x=sum/2; int y=x+m; /*f[i][j]前i个数字和恰好等于j的方案数 */ f[1][1]=1; for(int i=2;i<=n;i++){ for(int j=1;j<=y;j++){ f[i][j]=f[i-1][j]; if(i==j) f[i][j]++; if(i<j) f[i][j]+=f[i-1][j-i]; cout<<f[i][j]<<" "; } cout<<endl; } //m==0时 有x、y互换的重复 if(m==0) cout<<f[n][y]/2<<endl; else cout<<f[n][y]<<endl; return 0; }
上一题 下一题