hdu2058 The sum problem

来源:互联网 发布:js中split的用法不支持 编辑:程序博客网 时间:2024/05/16 14:03

The sum problem

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


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]


找一个子序列的和等于M,那么这个子序列可以看成a+1, a+2, ... , a+d 这时,d就为这个序列的长度,起始数字就是a+1,而这个序列的和即M=a*d + (1 + d) * d /2;得出d*d<2 * m,从而可以枚举d,计算出a
#include<iostream>#include<cmath>using namespace std;int main(){        int n,m;        int d,b;        while(cin>>n>>m && (n||m)){                for(d=sqrt(2.0 *m); d>0;d--){                        b=m-(d+d*d)/2;                        if(b%d==0)                        cout<<"["<<(b/d)+1<<","<<(b/d)+d<<"]"<<endl;                }                cout<<endl;        }        return 0;}

网络上的其他相关代码:
#include <stdio.h>#include <math.h>int main(){int n, m, len, a;while(~scanf("%d%d", &n,&m)){if(!n && !m)break;len = sqrt(double(m * 2)) + 1;//根据等差数列来算,数列长度// m = (a + a + len - 1) * len / 2// m = a * len + len(len - 1)/ 2// m - len * (len - 1) / 2 = a * len//a = m / len - (len - 1) / 2while(--len){a = m / len - (len - 1) / 2;if((a + a + len - 1) * len / 2 == m){printf("[%d,%d]\n", a, a+len - 1);}}printf("\n");}return 0;}


0 0
原创粉丝点击