題目描述 對一個給定的自然數M,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為M。 例子:1998+1999+2000+2001+2002 = 10000,所以從1998到2002的一個自然數段為M=10000的一個解。 輸入輸出格式 輸入格式: 包含一個整數的單獨一行給出M的值(10 ...
題目描述
對一個給定的自然數M,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為M。
例子:1998+1999+2000+2001+2002 = 10000,所以從1998到2002的一個自然數段為M=10000的一個解。
輸入輸出格式
輸入格式:包含一個整數的單獨一行給出M的值(10 <= M <= 2,000,000)。
輸出格式:每行兩個自然數,給出一個滿足條件的連續自然數段中的第一個數和最後一個數,兩數之間用一個空格隔開,所有輸出行的第一個按從小到大的升序排列,對於給定的輸入數據,保證至少有一個解。
輸入輸出樣例
輸入樣例#1:combo.in 10000輸出樣例#1:
combo.out 18 142 297 328 388 412 1998 2002
其實這道題數學二分什麼的都完全沒必要
做一個首碼和
然後暴力枚舉就可以
註意要加剪紙否則超時
永遠記住:
暴力出奇跡!!!!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 const int MAXN=10000001; 7 int a[MAXN]; 8 int ans=0; 9 int main() 10 { 11 int n; 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++) 14 a[i]=a[i-1]+i; 15 for(int i=1;i<n;i++) 16 { 17 for(int j=i;j<n;j++) 18 { 19 if(a[j]-a[i]==n) 20 { 21 printf("%d %d\n",i+1,j); 22 } 23 if(a[j]-a[i]>n)break; 24 } 25 } 26 return 0; 27 }