開啟章節選單

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;
}