题目1354:和为S的连续正数序列

时间限制:2 秒

内存限制:32 兆

特殊判题:

提交:2008

解决:622

题目描述:

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

输入:

输入有多组数据。

每组数据仅包括1个整数S(S<=1,000,000)。如果S为负数时,则结束输入。

输出:

对应每组数据,若不存在和为S的连续正数序列,则输出“Pity!”;否则,按照开始数字从小到大的顺序,输出所有和为S的连续正数序列。每组数据末尾以“#”号结束。

样例输入:
4
5
100
-1
样例输出:
Pity!
#
2 3
#
9 10 11 12 13 14 15 16
18 19 20 21 22
#

题解:(m+n)(n-m+1)/2=N;令m+n=i;然后找n-m+1

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
int X,Y;
int main(){
LL N,m,n;
while(scanf("%lld",&N),N>=){
int flot=;
for(int i=sqrt(*N);i>=;i--){
if((*N)%i==){
n=(-+i+*N/i)/;
m=*N/i-n;
// printf("%d %d %d\n",i,m,n);
if((n+m)*(n-m+)!=*N)continue;
flot=;
for(int i=m;i<=n;i++){
if(i-m)printf(" ");
printf("%d",i);
}
puts("");
}
}
if(!flot)puts("Pity!\n#");
else puts("#");
}
return ;
}

第二种解法,很好:

代码:、

 /*#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
int X,Y;
int main(){
LL N,m,n;
while(scanf("%lld",&N),N>=0){
int flot=0;
for(int i=sqrt(2*N);i>=2;i--){
if((2*N)%i==0){
n=(-1+i+2*N/i)/2;
m=2*N/i-n;
// printf("%d %d %d\n",i,m,n);
if((n+m)*(n-m+1)!=2*N)continue;
flot=1;
for(int i=m;i<=n;i++){
if(i-m)printf(" ");
printf("%d",i);
}
puts("");
}
}
if(!flot)puts("Pity!\n#");
else puts("#");
}
return 0;
}*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
const int INF=0x3f3f3f3f;
typedef long long LL;
int main(){
int T;
int N;
while(scanf("%d",&N),N>=){
int l=,r=;
int sum=;
int flot=;
while(l<r){
if(sum==N){
flot=;
for(int i=l;i<=r;i++){
if(i-l)printf(" ");
printf("%d",i);
}puts("");
r++;
sum+=r;
}
if(sum>N){
sum-=l;
l++;
}
else{
r++;
sum+=r;
}
}
if(!flot)puts("Pity!\n#");
else puts("#");
}
return ;
}
05-02 15:22