傳送門
對乙個給定的自然數\(m\),求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為\(m\)。
例子:\(1998+1999+2000+2001+2002 = 10000\),所以從\(1998\)到\(2002\)的乙個自然數段為\(m=10000\)的乙個解。
包含乙個整數的單獨一行給出m的值(\(10 \le m \le 2,000,000\))。
每行兩個自然數,給出乙個滿足條件的連續自然數段中的第乙個數和最後乙個數,兩數之間用乙個空格隔開,所有輸出行的第乙個按從小到大的公升序排列,對於給定的輸入資料,保證至少有乙個解。
10000
18 142
297 328
388 412
1998 2002
這道題在試煉場的數論部分,但我死活沒看出來這道題怎麼數論(還是太菜,,),於是就寫了個暴力,ac
了。
???????
於是我開啟了題解區,然後就看到了題解區的第一位神仙@突然頹廢 ,瞬間茅塞頓開。(我太菜了啊啊啊啊
以下是數學方法:
設首項為\(l\),末項為\(r\),那麼顯然
\[\sum_^ri = (l+r)(r-l+1)/2\\
2\sum_^ri = (l+r)(r-l+1)\]
若\[\begink_1 = r - l + 1\\k_2 = l + r\end
\]解這個引數為\(k_1, k_2\)的二元一次方程組:
\[\beginl=\dfrac\\\\r=\dfrac\end
\]回到開始,因為
\[2\sum_^ri = (l+r)(r-l+1)
\]所以
\[2\sum_^ri = k_1k_2
\]這樣,\(k_1\)在\(1 \sim \sqrt\)的區間列舉,能保證可以列舉到每乙個解,而且\(k_2,l,r\)都可以算出來。
而且我們可以發現,只有當 \(k_1\not \equiv k_2\pmod\)的時候,\(l\)和\(r\)才會有整數解。原因很簡單,如果 \(k_1\equiv k_2\pmod\),顯然無論是\(k_1 + k_2\)還是\(k_2 - k_1\),結果都是偶數,再\(\pm1\)就變成了奇數,除以2就不是整數了,所以\(k_1\)和\(k_2\)必須一奇一偶。
但是請注意還有一種情況,\(l = r\) ,這在題目中是不允許的行為,在程式中我們應該排除。列不等式:
\[l \neq r\\\dfrac \neq \dfrac\\k_2-k_1+1 \neq k_1+k_2-1\\1-k_1 \neq k_1 - 1\\k_1 \neq 1
\]也就是說,\(k_1\)應該在\(2 \sim \sqrt\)列舉才對。
不得不說這個方法是真的妙!
這種演算法的時間複雜度是\(o(\sqrt)\)。
我寫的辣雞暴力:
/*
* @author: crab-in-the-northeast
* @date: 2020-02-26 02:34:12
* @last modified by: crab-in-the-northeast
* @last modified time: 2020-02-26 03:46:31
*/#include #include int main()
return 0;
}
神仙數學解法(純手打,樣例過了):
#include #include #include #include int main()
ac 100
:r31068037 luogu P1147 連續自然數和
對乙個給定的自然數m,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為m。例子 1998 1999 2000 2001 2002 10000,所以從1998到2002的乙個自然數段為m 10000的乙個解。輸入格式 包含乙個整數的單獨一行給出m的值 10 m 2,000,000 輸出格式...
洛谷1147 連續自然數和
對乙個給定的自然數m,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為m。例子 1998 1999 2000 2001 2002 10000,所以從1998到2002的乙個自然數段為m 10000的乙個解。輸入輸出格式 輸入格式 包含乙個整數的單獨一行給出m的值 10 m 2,000,0...
P1147 連續自然數和
對乙個給定的自然數m,求出所有的連續的自然數段,這些連續的自然數段中的全部數之和為m。例子 1998 1999 2000 2001 2002 10000,所以從1998到2002的乙個自然數段為m 10000的乙個解。輸入格式 包含乙個整數的單獨一行給出m的值 10 m 2,000,000 輸出格式...