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