HDU2058 找规律+递推

来源:互联网 发布:淘宝自动分销怎么取消 编辑:程序博客网 时间:2024/05/19 16:28

The sum problem

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21732    Accepted Submission(s): 6380


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 1050 300 0
 

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


等差数列求和的问题,不过这里数据量过大所以要剪枝

我一开始想的是2*i肯定大于m,但是还是超了,看了人家的优化方案是这样的

1+2+。。。+(2*m)^1/2>m
#include <iostream>#include <math.h>using namespace std;int main(){    __int64 m ,n;    while(cin>>n>>m,n||m)    {        __int64 a,k;        for(k=(int)sqrt(2*m);k>0;k--)//因为1+2+。。。+(2*m)^1/2>m;所一和为m的元素个数应该小于等于(2*m)^1/2;        {            a=m/k-(k-1)/2;//假设从a开始一直加到a+k-1,一共k个元素和为m,可以计算出a;            if((2*a-1+k)*k==2*m) //(2*m)^1/2可能不是整数,判断是有必要的;                cout<<"["<<a<<","<<k+a-1<<"]"<<endl;        }cout<<endl;    }return 0;}


0 0