uvalive3882(約瑟夫環) B

題目鏈接如下:




題意:

約瑟夫環;第一個刪除第m個,然後每k個刪除一個,問最後剩下的一個;


思路:
因爲每刪除一個後,我們都可以把剩下的重新編碼;
當常規的約瑟夫環時,也就是從第一個開始,數k個刪除;那麼
f(n) = (f(n-1) + k) % n;
所以第一個數刪除m的時候
我們算出常規約瑟夫環的解f(n)後;
結果就是

(m - k + 1 + f(n)) % n;

具體代碼實現如下:

#include<cstdio>  
#include<cstring>  
  
const int N = 10005;  
int n, k, m, ans;  
int f[N];  
  
int main() {  
    while(scanf("%d%d%d", &n, &k, &m) && n) {  
        f[1] = 0;  
        for(int i = 2; i <= n; i++)   
            f[i] = (f[i - 1] + k) % i;  
        ans = (m - k + 1 + f[n]) % n;  
        if (ans <= 0) ans += n;  
        printf("%d\n", ans);  
    }  
    return 0;  
}  


發佈了88 篇原創文章 · 獲贊 60 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章