(noip模擬 約瑟夫遊戲)


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;
}
發佈了80 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章