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]
通过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;
}