109 环形链表的约瑟夫问题
Table of Contents

ac

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static Scanner sc = new Scanner(System.in);

    public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        int n = sc.nextInt();
        int m = sc.nextInt();
        System.out.println(f(n, m) + 1);
    }

    static int f(int n, int m){
        if(n == 1){
            return 0;
        }
        return (f(n-1, m) + m) % n;
    }
}
0  1  ...  M-3  M-2  M-1  M  M+1 ... n-2  n-1

第一次M-1出局,剩下n-1个数,从M开始

M M+1 ...  n-2  n-1  0  1  ...  M-3   M-2

如果对应如下序号的话:

0  1  ...  M-3  M-2  M-1 M  M+1  ...  n-2  n-1

相当于移动了M个位置

n-1时候的【M-1】 + M个位置 能得到 n 时候的【M-1】,所谓的【M-1】就是那个要出局的数

假设f(n-1, m)n-1个数要出局的那个数,那么n个数,要出局的数为(f(n-1, m) + m) % n

所以有如下的递推方法

static int f(int n, int m){
    if(n == 1){
        return 0;
    }
    return (f(n-1, m) + m) % n;
}