Problem
【問題描述】
YJC 很喜歡玩遊戲,今天他決定和朋友們玩約瑟夫遊戲。
約瑟夫遊戲的規則是這樣的:n 個人圍成一圈,從 1 號開始依次報數,當報到 m 時,
報 1、2、…、m-1 的人出局,下一個人接着從 1 開始報,保證(n-1)是(m-1)的倍數。最後剩
的一個人獲勝。
YJC 很想贏得遊戲,但他太笨了,他想讓你幫他算出自己應該站在哪個位置上。
【輸入格式】
第一行包含兩個整數 n 和 m,表示人數與數出的人數。
【輸出格式】
輸出一行,包含一個整數,表示站在幾號位置上能獲得勝利。
【輸入輸出樣例】
joseph.in :10 10
joseph.out :10
【數據說明】
對於 30%的數據,滿足 2≤n≤1000;
對於 50%的數據,滿足 2≤n≤1000000;
對於 100%的數據,滿足 2≤m≤n<2 63 -1 且(n-1)是(m-1)的倍數。
Solution
自己想
Code
// by spli
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define LL unsigned long long
using namespace std;
LL n,m;
LL ans;
LL dfs(LL k,LL r){
if(k==1) return 1ll;
LL x=k/m,y=k%m;
ans=dfs(x+y,y);
ans*=m;ans-=r;
return ans;
}
int main(){
cin>>n>>m;
ans=dfs(n,0);
cout<<ans;
return 0;
}