洛谷----P1147 連續自然數和

0k-ok發表於2020-11-10

舊人舊事更值得懷念,或悲或喜每個人身上都承載著某一段時光,但是我會永遠清澈永遠瘋狂永遠浪漫。沒有人能回到過去重新活過,但你我都可以從現在開始,決定我們未來的模樣。
                                                                                                                                                                           ----喻言

 

題目描述

對一個給定的自然數MM,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為MM。

例子:1998+1999+2000+2001+2002 = 100001998+1999+2000+2001+2002=10000,所以從19981998到20022002的一個自然數段為M=10000M=10000的一個解。

輸入格式

包含一個整數的單獨一行給出M的值(10 \le M \le 2,000,00010≤M≤2,000,000)。

輸出格式

每行兩個自然數,給出一個滿足條件的連續自然數段中的第一個數和最後一個數,兩數之間用一個空格隔開,所有輸出行的第一個按從小到大的升序排列,對於給定的輸入資料,保證至少有一個解。

輸入輸出樣例

輸入 #1複製

10000

輸出 #1複製

18 142 
297 328 
388 412 
1998 2002
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <complex>
#include <iomanip>
#include <numeric>
#include<unordered_set>
#include <climits>//INT_100010n
#include <regex>
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define INF 0x7fffffff;
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
#define LL unsigned int
#define mod 1000000007
#define wc 1e-18
typedef long long ll;
using namespace std;
ll s[2000010],n;
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
        s[i]=s[i-1]+i;
    for(int i=1; i<=n; i++)
    {
        ll md=s[i-1]+n;
        ll a=lower_bound(s,s+n+1,md)-s;
        if(s[a]-s[i-1]==n)
        {
            if(i!=a)
                cout<<i<<" "<<a<<endl;
        }
    }
    return 0;
}