1. 程式人生 > 其它 >LuoguP4759 [CERC2014]Sums 題解

LuoguP4759 [CERC2014]Sums 題解

LuoguP4759 [CERC2014]Sums 題解

Content

給定 \(t\) 組資料,每組資料給定一個數 \(n\),判斷 \(n\) 是否能夠分解成連續正整數和,能的話給出最小數最大的方案。

資料範圍:\(1\leqslant n\leqslant 10^9\)

Solution

這道題如果暴力列舉的話,看資料範圍就知道肯定會爆炸。因此我們要考慮推式子。

首先,我們設分解後的數列長度為 \(k\),首項為 \(a_1\)。那麼顯然得到 \(\text{(1)}\) 式:

\(\begin{aligned}n&=\dfrac{(a_1+(a_1+k-1))k}2\\&=\dfrac{(2a_1+k-1)k}2\end{aligned}\)

由於 \(a_1,k>0\),在 \(a_1>0\) 兩邊同時加上 \(a_1+k-1\) 得:

\[2a_1+k-1>k \]

然後我們由 \(\text{(1)}\) 式可得 \(2a_1+k-1=\dfrac{2n}{k}\),代入不等式:

\[\begin{aligned}\dfrac{2n}{k}&>k\\k^2&<2n\\k&<\sqrt{2n}\end{aligned} \]

我們由樣例可得 \(k\geqslant 2\)(讀者自證不難),又因為 \(k\) 是正整數,所以得到了 \(k\) 的範圍為:\(k\in[2,\left\lfloor\sqrt{2n}\right\rfloor]\)

這樣我們就可以考慮通過列舉 \(k\) 來求得答案。現在看 \(a_1\)

我們還是通過 \(\text{(1)}\) 式求解:

\[\begin{aligned}2a_1+k-1&=\dfrac{2n}k\\2a_1&=\dfrac{2n-k^2+k}k\\a_1&=\dfrac{2n-k^2+k}{2k}\end{aligned} \]

又因為 \(a_1\) 是正整數,所以只需要判斷是否有下列條件成立即可:

  • \(2k\mid(2n-k^2+k)\)
  • \(\dfrac{2n-k^2+k}{2k}>0\)

枚舉出符合條件的方案我們就可以輸出了,並且我們算一下不難發現,從 \(2\)

列舉到 \(\left\lfloor\sqrt{2n}\right\rfloor\) 第一個找出來的方案就是題目所要求的最小數最大的方案。注意輸出的格式即可。如果列舉完了還是沒有找到方案那就直接輸出 IMPOSSIBLE 就好。

Code

int main() {
	MT {
		int n = Rint, flag = 1;
		F(len, 2, (int)sqrt(2 * n)) {
			if(!((2 * n - len * len + len) % (2 * len)) && (2 * n - len * len + len) / (2 * len) > 0) {
				int a1 = (2 * n - len * len + len) / (2 * len);
				printf("%d = ", n);
				F(i, a1, a1 + len - 1) {
					printf("%d ", i);
					if(i != a1 + len - 1) printf("+ ");
					else puts("");
				}
				flag = 0; break;
			}
		}
		if(flag) puts("IMPOSSIBLE");
	}
	return 0;
}