【hd水题】hdoj2058 The sum problem

The sum problem

Problem Description

Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequences that the sum of the sub-sequence is M.

 

 

Input

Input contains multiple test cases. each case contains two integers N, M( 1 <= N, M <= 1000000000).input ends with N = M = 0.

 

 

Output

For each test case, print all the possible sub-sequence that its sum is M.The format is show in the sample below.print a blank line after each test case.

 

 

Sample Input

 

20 10 50 30 0 0

 

 

Sample Output

 

[1,4] [10,10] [4,8] [6,9] [9,11] [30,30]

 

分析:从1开始算的话,提交会超时,所以只能用别的方法。

等差数列前n项和:m=Sn=d/2*n^2+(a1-d/2)*n;

n表示等差数列一个几项,n从最大开始算,没循环一次,n就减小,这样效率就会降低。

利用等差公式得:第一次算,要使n最大,所以,a1=1,d=1;所以,n^2+n-2*m=0;

n=(sqrt(1+8*m)-1)/2;在返回去求出a1:a1=(m/n-n+1)/2;如果,a1是整数,就说

明找到了相应的值,而最后一项自然是a1+n-1;这样不用一个一个加,相比之下还算省时。

 

代码如下:

#include<cstdio> #include<cmath> int main() {__int64 N,m,n; while(scanf("%I64d%I64d",&N,&m),N+m)     {     double a1;      n=(int)((sqrt(8*m+1)-1)/2);     while(n--)     {a1=1.0;     a1=(m*2.0/n-n+1)/2;     if(a1==(int)a1)     printf("[%d,%d]\n",(int)a1,(int)a1+n-1);     }     printf("\n");     } return 0; }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值