class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算出旺仔哥哥最后会站在哪位小朋友旁边
     * @param a int整型vector 第 i 个小朋友的数字是 a_i
     * @param m int整型 表示旺仔哥哥的移动次数
     * @return int整型
     */
    int stopAtWho(vector<int>& a, int m) {
        // write code here
	  //本题实际上是一个类约瑟夫环问题,只是不需要跳过第m个小朋友(详见本题单数组问题,约瑟夫环)
	  //因此不需要用if来判断该小朋友是否需要跳过,只需一直走即可
	  //难点于往后绕回,请见下方题解
        int n=a.size();//获取数组长度
        int cur{};//第cur个小朋友(其实就是一条指针)
        while(m--)//循环m次
        {
            int k=a[cur];//第cur个小朋友身上代表的步数
            cur=((cur-k%n)+n)%n;//需要走的步数
		  /*下面详细解析这个表达式的含义:
		  首先是cur-k%n,意思是当前步数减去第cur个小朋友身上的步数,显然如果k>n,
		  那么指针会多转至少一圈才会回到原点,我们不好处理这个转圈的过程,于是让k对n取模。
		  
		  接着是加了一个n,这里可以让负数变成整数,如果k的值比指针cur的值大,加上一个n就能让指针
		  回到它该有的值(可以自己拿实例走一遍试试)。
		  
		  最后是取模n,这一步是为了消除先前加n的影响,如果指针cur减去步数k以后大于0,那么本来就不需要加n,加上这个n以后就会溢出,显然不是我们想要的结果。*/
        }
        return cur+1;//返回1-based
    }
};