|

楼主 |
发表于 2019-1-22 23:27:07
|
显示全部楼层
//思路:等差数列,因为从1开始,项数等于尾项-首项+1,所以项数一定和对应项数两者奇偶不同。
//若项数为奇数,对应两个项的和则为偶数。
//例如:1 4 两个数,其中包含4个项(1,2,3,4)为偶数,但1+4=5为奇数。
//既然是一个连续的数列,那么它们的和等于他们的平均数×项数,平均数可能为0.5,将其整体扩大2倍,平均数则为整数。
//若项数为奇数,其对应首位项和必为偶数,若项数为偶数,其对应首位项和必为奇数。
//项数和对应首位项和不可能同为奇,即(x+2*m/x)%2一定为奇数。
int main(){
int m;
cin>>m;
for( int x=sqrt((double)(2*m)) ; x>1 ; x-- ) //x是连续自然段的个数(项数),即x为首项数和尾项数的差+1
if( (2*m)%x==0 && (x+2*m/x)%2 ) //2m是x的倍数,x+y是奇数
{
int y=2*m/x; //2倍的平均数,即y是符合条件的首项和尾项的和,防止平均数是小数?
cout<<(y-x+1)/2<<" "<<(y+x-1)/2<<endl; //平均数-项数*0.5,平均数+项数*0.5。将之前扩大的两倍缩小 验证:(y+x-1)/2-(y-x+1)/2=x-1,共x项,。
}
return 0;
} |
|