開啟章節選單
10110 Light, more light
題目說明
有個人叫做 mabu,他會來回在走廊中切換燈泡開關。
走廊上有 n 個燈泡,每個燈泡對應一個開關,開關按一次會改變燈泡狀態(開 → 關,關 → 開)。
他總共會走 n 趟(來回算一趟,但只有「去」的時候會按開關)。
在第 i 趟走的時候,他會按下所有編號是 i 的倍數的開關。
判斷第 n 個燈泡最後是亮著還是關著?
輸入說明
每個測試資料一行,包含一個整數𝑛,代表走廊共有多少個燈泡。𝑛 = 0 代表輸入結束。
輸出說明
如果最後一個燈泡是亮著的請輸出 yes,如果是暗著的請輸出 no。
解題思路
- 直接看測資通靈得知判斷是否是完全平方數。
- 每顆燈泡的狀態會根據它被切換了幾次來決定:
-
被切換奇數次 → 亮著(on)
-
被切換偶數次 → 關著(off)
-
mabu 在第 i 趟會切換「編號是 i 的倍數」的燈泡,也就是說第 k 號燈泡會在它所有因數的編號那一趟被切換。
-
舉例 6:因數有:1, 2, 3, 6(共 4 個 → 被切換 4 次 → 偶數次 → 關掉)
-
舉例 9:因數有:1, 3, 9(共 3 個 → 被切換 3 次 → 奇數次 → 亮著)
- 只有當一個數是完全平方數時,才會有「重複的因數」
- 完全平方數會有奇數個因數 → 最後會被切換奇數次 → 燈是亮的
- 其他數字都會有偶數個因數 → 燈是關的
程式碼
#include <bits/stdc++.h> using namespace std; int main() { long long n; while (cin >> n, n) // 當 n ≠ 0 時才繼續處理 { if (n == 1) { cout << "yes" << endl; // 1 是 1 的平方數 continue; } long long root = sqrt(n); if (root * root == n) cout << "yes" << endl; // 完全平方數:燈泡是開的 else cout << "no" << endl; // 不是完全平方數:燈泡是關的 } return 0; }