HDU 2058 The sum problem Time(等差と推理のような数学の問題)
2592 ワード
The sum problem
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18728 Accepted Submission(s): 5561
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
Sample Output
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18728 Accepted Submission(s): 5561
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]
// : Sn=(a1+an)*n/2 2
Sn=na1+n(n-1)d/2
a1=1 N a1=1 2Sn=n(n+1)=2*m n<=sqrt(2*m)
n=[1,sqrt(2*m)] a1 an n m
#include <iostream>
#include <cstdio>
#include <math.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <iomanip>
#include <stdlib.h>
using namespace std;
int main(){
int n,m,i,a1,an;
while(cin>>n>>m){
if(n==0&&m==0)
break;
for(i=sqrt(2*m);i>=1;i--){
a1=(2*m-i*i+i)/(2*i);
an=a1+(i-1);
if(an<=n&&(a1+an)*i==2*m)
cout<<"["<<a1<<","<<an<<"]"<<endl;
}
cout<<endl;
}
return 0;
}