HDOJ-2058(The sum problem)(找规律)(数学)

19 篇文章 0 订阅
7 篇文章 0 订阅

HDOJ-2058(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]
 
注:这题主要要找到切入口(等差公式):假如有满足题意的情况:a+1,a+2,a+3,........a+n=m;即:(n*a)+n*(n+1)/2=m可以得到;n*n<2*m。

通过for循环,从1,2,3,........n,全部遍历一遍,查找满足条件的情况,即使得(n*a)+n*(n+1)/2=m成立(n,m已知,只需求出a,若a存在,则说明该种情况符合)

输出:[a+1,a+n].

刚开始无从下手,看了别人的题解才知道上面的解法。


My   solution:

/*23016.3.3*/

超时:(本人最开始的做法)

#include<stdio.h>
int main()
{
	int i,j,k,n,m,sum,t;
	while(scanf("%d%d",&n,&m)==2&&(n||m))
	{
		k=1;
		sum=0;
		t=(m+1)/2;
		if(t>n)
		t=n;
	   for(i=1;i<=t;i++)
	   {
	   	  
	   	  sum+=i; 
	   	  if(sum==m)
	   	  {
	   	  	printf("[%d,%d]\n",k,i);
		  }
		  else
		  if(sum>m)
		  {
		  	for(j=k;j<=i;j++)
		  	{
		  		sum-=j;
		  		k=j+1;
		  		if(sum==m)
		  		{	
		  			printf("[%d,%d]\n",k,i);
				}
				if(sum<m)
				break;
			}
		  }
	   }
	   if(m<=n)
	   printf("[%d,%d]\n",m,m);	
	   printf("\n");
	}
	return 0;
}

看了别人的题解后:

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std; 
int main()
{
int n,m,i,j,k,t;
while(scanf("%d%d",&n,&m)==2&&(n||m))
{
k=sqrt(2*m);
for(i=k;i>0&&i<=n;i--)
{
t=m-i*(i+1)/2;
if(!(t%i))//判断a存不存在 
printf("[%d,%d]\n",t/i+1,t/i+i);
}
printf("\n");
}
    return 0;
}





  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值