題目描述:
有 m 個好人和 m 個壞人坐成一個圈,前 m 個人是好人(編號爲 1, 2, 3, …, m),後 m 個人是壞人(編號爲 m + 1, m + 2, …, 2m)。現在他們開始循環報數,要求從編號爲 1 的人開始報,如果有人報到 k 則他必須死亡,而死掉的人的下一個人則繼續從 1 開始報數。請求出最小的 k 使得,所有的壞人都死掉而好人都活下來。
輸入描述:
多組輸入,每組輸入 1 行,爲一個整數 m (1 <= m <= 12)
輸出描述:
對於每組輸入,輸出爲 1 個整數 k 爲使得壞人都死掉的最小報的數
樣例輸入:
3
4
樣例輸出:
5
30
C++代碼
#include<iostream>
using namespace std;
int ysf(int sum, int k, int n){
if(n == 1){
return (sum + k - 1) % sum + 1;
}
return (ysf(sum-1,k,n-1) + k - 1) % sum + 1;
}
int main(){
int m;
while(cin >> m){
int sum = 2 * m, n = 0;
int k = m + 1;
while(++n <= m){
int t = ysf(sum,k,n);
if(t <= m){
n = 0;
k++;
}
}
cout << k << endl;
}
return 0;
}