class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型vector 给定数组
     * @return int整型vector
     */

    // 找到最小公倍数
    int findMin(int a, int b){
        int n = 0;

        int max = a > b ? a : b;
        int min = a > b ? b : a;
        int cnt = max / min;
        while (1) {
            n = cnt * min;
            if(n % max == 0) break;
            ++cnt;
        }

        return n;
    }   

    vector<int> solve(int n, int m, vector<int>& a) {
        // write code here

        int tmp = 0;
        int pre = a[0];
        int idx = 0;
        m = m % a.size();
        if(m == 0) return a;
        int max = findMin(m, a.size());

        for(int i = 0; i < a.size(); i++){
            idx += m;
            tmp = a[idx % a.size()];
            a[idx % a.size()] = pre;
            pre = tmp;
            
            if(idx >= max){
                idx = idx % a.size() + 1;
                pre = a[idx];
            }
        }

        return a;
    }
};