HDU 2058 The sum problem 題解
阿新 • • 發佈:2018-12-16
由題意得:
1.輸入第一個數“n”,作為首項與公差都為“1”的末項
2.輸入第二個數“m”,輸出序列和為“m”的所有子序列,既找到首項“a1”與項數"len"
3.由等差數列求和公式 S=n*(a1+an)/2=a1*n+n*(n-1)*d/2 得:a1*len=m-len*(len+1)/2 所以m-len*(len+1)/2與len存在倍數關係
4.m=((x+1)+(x+2)+(x+3)+……+(x+len))=(x+1+x+len)*len/2=m 所以當“x”取最小值“0”時,len最大 (1+len)*len/2=m 所以len<sqrt(2*m)
5.程式碼如下:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { int n,m; while(cin>>n>>m,n||m) { int len=(int)(sqrt(m*2)); for(int i=len;i>=1;i--) { int t=m-i*(i+1)/2; if(t%i==0) printf("[%d,%d]\n",t/i+1,t/i+i); } cout<<endl; } return 0; }