HDOJ 题目2058The sum problem(数学)
2014-08-23 02:10
323 查看
The sum problem
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15381 Accepted Submission(s): 4620
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]
Author
8600
Source
校庆杯Warm Up
Recommend
linle | We have carefully selected several similar problems for you: 2056 2062 2060 2061 2053
思路:
先确定一段和sum=m的最长的长度,要最长则起点从1开始,根据等差求和,len*(len+1)/2=m;放缩法则len^2<2*m,所以len=pow(2.0*m,0.5);现在根据长度确定起点L,根据等差求和公式,((len+L-1)+L)*len/2=m;
=> L=(2*m/len+1-len)/2; 判断时反代上式是否成立,是则输出[L,L+len-1。
ac代码
#include<stdio.h> #include<math.h> int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF,n||m) { //int len=sqrt((double)2*m); int len=(int)pow(2.0*m,0.5); if(len>n) len=n; for(;len>=1;len--) { int l=(2*m/len-len+1)/2; if(((len-1+l)+l)*len/2==m) printf("[%d,%d]\n",l,len+l-1); } printf("\n"); } }
相关文章推荐
- HDOJ题目1392Surround the Trees(数学几何,凸包模板)
- HDOJ 题目1719 Friend(数学)
- HDOJ题目2502月之数(数学,递推)
- HDOJ 题目2603 Wiskey's Power(数学)
- HDOJ 题目2306 改革春风吹满地(数学 几何)
- HDOJ 题目4104 Discount(数学,技巧)
- HDOJ 题目5100 Chessboard(数学乱搞)
- HDOJ 题目1722 Cake(数学)
- HDOJ 题目5496 Beauty of Sequence(数学)
- HDOJ题目1701ACMer(数学)
- HDOJ 题目4832 Chess(DP,组合数学)
- HDOJ题目1443Joseph(数学)
- HDOJ 题目1597 find the nth digit(数学)
- HDOJ题目1290献给杭电五十周年校庆的礼物(数学,递推)
- HDOJ题目2086 A1 = ?(数学)
- HDOJ题目4705 Y(简单树形DP+数学)
- HDOJ 题目4549 M斐波那契数列(数学,矩阵快速幂,费马小定理)
- HDOJ 题目4983 Goffi and GCD(数学,欧拉函数)
- HDOJ 题目2899 Strange fuction(数学 导数)
- HDOJ 题目2036 改革春风吹满地(数学,几何,水题)