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; }