AcWing 82 圓圈中最後剩下的數字

2021-09-21 14:28:19 字數 734 閱讀 9321

0, 1, …, n-1這n個數字(n>0)排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。

求出這個圓圈裡剩下的最後乙個數字。

樣例

輸入:n=5 , m=3

輸出:3

在這n個數字中,第乙個被刪除的數字是(m-1)%n,為簡單起見記為k。那麼刪除k之後的剩下n-1的數字為0,1,…,k-1,k+1,…,n-1,並且下乙個開始計數的數字是k+1。相當於在剩下的序列中,k+1排到最前面,從而形成序列k+1,…,n-1,0,…k-1。接下來我們把剩下的的這n-1個數字的序列k+1,…,n-1,0,…k-1作乙個對映,對映的結果是形成乙個從0到n-2的序列:

k+1   ->    0

k+2   ->    1

…n-1    ->    n-k-2

0       ->    n-k-1

…k-1    ->    n-2

可以發現,如果對映之後的數字是x,那麼x對應的對映前的數字為(x+k+1)%n。記最初的序列最後剩下的數字為f(n,m),由於對映之後的序列和最初的序列有同樣的形式,都是從0開始的連續序列,因此仍然可以用函式f來表示,那麼對映後的序列最後剩下的數字為f(n-1,m),然後我們需要把它對映到最初的序列的標號,所以為:( f(n-1,m) + k + 1) % n,化簡後得:[f(n-1,m)+m]%n。於是便可以寫出**了。

class solution 

};

45 圓圈中最後剩下的數字

面試題45 圓圈中最後剩下的數字 每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首...

劍指62 圓圈中最後剩下的數字

題目 0 n 1的n個數排成乙個圓圈,從0開始每次從這個圓圈刪除第m個數字,然後從刪除的數字的下乙個數字開始繼續直到剩最後1個數字位置。方法1 用list模擬圓圈 的環形鍊錶 每次迴圈到end 時都手動更新到begin 效率不高 stl list使用 class solution cur circl...

劍指 62 圓圈中最後剩下的數字

題目描述 0,1,n 1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。演算法分析 方法一 使用鍊錶來模擬圓圈,時間複雜度為o mn 空間複雜度o n 方法二 約瑟夫環問題的數學公式法求解,公式推導見約瑟夫環問題 最簡單的數學解法 得到公式f n...