/* date:107/10/13 author:Chen Yi Jing 人圍成圈,用質數去繞圈,質數數完被點到的人會被殺掉,求最後倖存者 1. TLE */ #include using namespace std; int main() { //將前 3500 個質數都算出來 int p[3502] = {0}; int number = 4; int index = 3; p[1] = 2; p[2] = 3; while (p[3501] == 0) { for (int i = 2; i < number / 2 + 1; i++) { if(number % i == 0) { break; } if(i == number / 2) { p[index] = number; index++; } } number++; } //輸入的部份 int n = 0; int copy_n = 0; while(cin >> n) { copy_n = n; int point = 0; //用來看現在數到哪個人 int counter = 0; //用來倒數質數的 int num[n + 1]; //某人是否存活 1:活 0:死 //初始化為 1 for (int k = 0; k <= n; k++) { num[k] = 1; } if (n == 0) break; while (n > 1) { // 存活人數 > 一人 for (int i = 1; i < 3501; i++) { if (p[i] % n != 0) { counter = p[i] % n; //如果質數相對人數很大取餘數就好 } else { counter = n; } // cout << "質數 " << counter << endl; while (counter > 0) { if (point == copy_n) { point = 0; } if (num[point + 1] == 1) { counter--; point++; } else { point++; } if (counter == 0) { num[point] = 0; //第 point 人被殺 n = n - 1; //總人數少 1 // cout << "人數 " << n << endl; } } // cout << "被殺 " << point << endl; // cout <<"---------------"<< endl; if (n == 1) break; } //輸出最後倖存者 if (n == 1) { for (int i = 1; i <= copy_n; i++) { if (num[i] == 1) cout << i << endl; } } } } cout << endl; }