題目:
題意:
給定乙個數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 #include5 #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的...