洛谷P1147 連續自然數和 二分

2022-06-26 03:21:13 字數 1179 閱讀 7140

題目

題意:

給定乙個數m,問有多少個數對$(i,j)$,使得$i$到$j$區間的所有整數之和為m。輸出所有的解。

思路:

根據公式$(a,b)$中的所有數之和為$\frac$,他等於定值$m$

經過整理我們可以發現$b^2 +b - a^2 + a = 2m$,如果我們確定了$a$,這條式子對於$b$就是遞增的。

顯然我們可以列舉$a$二分$b$。由於中間過程可能會爆int,所以直接就上longlong吧。

【二分】虐狗寶典學習筆記:

正確寫出二分的流程是:(整數域)

1、通過分析具體問題,確定左右半段哪乙個是可行區間,以及mid歸屬哪一半段。

2、根據分析結果,選擇"$r = mid, l = mid + 1, mid = (l + r)>>1$" 和 「$l = mid, r = mid - 1, mid = (l + r + 1) >> 1$」兩個配套形式之一。

3、二分終止條件是$l==r$,該值就是答案所在位置。

採用「$l = mid + 1, r = mid - 1$」或」$l = mid, r = mid$「來避免產生兩種形勢,但也相應地造成了丟失在$mid$上的答案、二分結束時可行區間未縮小到確切答案等問題,需要額外加以處理。

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include8 #include9 #include10 #include11

12#define inf 0x7f7f7f7f

13using

namespace

std;

14 typedef long

long

ll;15 typedef pairpr;

1617

ll m;

1819

intmain()

2030

else33}

34if(st * st - a * a + a + st == 2 * m)printf("

%lld %lld\n

", a, st);35}

3637

38return0;

39 }

洛谷P1147 連續自然數和

連續自然數和 題目描述 對乙個給定的自然數m,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為m m 2000000 例子 1998 1999 2000 2001 2002 10000,所以從1998到2002的乙個自然數段為m 10000的乙個解。分析可以把連續自然數段看成乙個等差數列...

洛谷 P1147 連續自然數和

對乙個給定的自然數m,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為m。例子 1998 1999 2000 2001 2002 10000,所以從1998到2002的乙個自然數段為m 10000的乙個解。包含乙個整數的單獨一行給出m的值 10 m 2,000,000 每行兩個自然數,給...

洛谷 P1147 連續自然數和

前言 只為轉c 而寫個解題報告。題目描述 對乙個給定的自然數m,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為m。例子 1998 1999 2000 2001 2002 10000,所以從1998到2002的乙個自然數段為m 10000的乙個解。輸入格式 包含乙個整數的單獨一行給出m的...