你1定聽說過約瑟夫問題,或它的“變種”――猴子選大王等故事吧。但是,你知道約瑟夫問題的歷史真相嗎?約瑟夫是公元1世紀著名的歷史學家。在羅馬人占據喬塔帕特后,39 個猶太人與約瑟夫及他的朋友躲到1個洞中,39個猶太人決定寧愿死也不要被敵人俘虜,因而決定了1個流傳千古的自殺方式,41個人排成1個圓圈,由第1個人開始報數,每報到第3人該人就必須自殺,然后再由下1個人重新報數,直到所有人都自殺身亡為止。但是約瑟夫和他的朋友其實不想遵從這個約定,約瑟夫要他的朋友先偽裝遵從,他將朋友與自己安排在第16個和第31個位置,因而逃過了這場死亡游戲。 現在我們把問題1般化,假定有n(n≥3且n≤100)個人,按1,2,...n編號圍坐1圈,從1號開始按1,2...,m報數,凡報m號的退出到圈外,如此循環報數直到圈內剩下2個人。請問,這兩個人的編號是多少?為了更好地感同身受,你可以假定你和你的朋友(最好是你心儀已久的人,這樣效果會更好)就在這n個人里面,面臨當年約瑟夫一樣的問題,所以你應當效法于約瑟夫,趕快想辦法和你的朋友逃誕生天。
第1行動1個整數t,表示有多組測試數據。接下來有t行,每行2個整數n和m,空格隔開。
對每組測試數據,輸出最后剩下的兩個人的編號,按從小到大輸出,以空格隔開,占1行。
2 3 2 5 4
1 3 1 2#include <iostream> using namespace std; int main() { int n,m,a[110],i,j,k,t; cin >> t; while(t--) { cin >> n >> m; for(i=0;i<n;i++) { a[i]=1; } i=0; k=0; j=0; while(n-j>2) { if(a[i]!=0) { k++; } if(k==m) { a[i]=0; j++; k=0; } if(i==n⑴) { i=0; } else { i++; } } for(i=0;i<n;i++) { if(a[i]==1) { cout << i+1 << " " ; } } cout << endl; } return 0; }