開啟章節選單
10110
題目說明
有個人叫做 mabu,他會來回在走廊中切換燈泡開關。
走廊上有 n 個燈泡,每個燈泡對應一個開關,開關按一次會改變燈泡狀態(開 → 關,關 → 開)。
他總共會走 n 趟(來回算一趟,但只有「去」的時候會按開關)。
在第 i 趟走的時候,他會按下所有編號是 i 的倍數的開關。
判斷第 n 個燈泡最後是亮著還是關著?
解題過程
1.直接看測資通靈得知判斷是否是完全平方數。
2.每顆燈泡的狀態會根據它被切換了幾次來決定:
被切換奇數次 → 亮著(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; }