#include <stdio.h>
#define MAXN 100
//返回两个整数的最大公约数
int Gcd(x, y)
{
int min = x < y ? x : y;
int max = x > y ? x : y;
int g = 1;
for (int i = 2; i <= min; i++)
{
if (min % i == 0 && max % i == 0)
{
g = i;
}
}
return g;
}
//数组元素循环左移的2n次移动解。任何位于数组下标i位置的数据,
//其目的地址是下标为(i-m+n)%n的位置,或者说将(i+m)%n位置的
//元素移到第i个位置。根据上述思路,可以将元素一次性定位
void LeftShift(int Array[], int n, int m)
{
//最大公约数决定移动的环的个数
for (int k = 0; k < Gcd(n, m); k++)
{
//每一个环开始时处理的下标
int i = k;
int tmp = Array[i];
while (1)
{
int j = (i + m) % n;
if (j == k)//处理到当前环最后一个位置时退出
{
Array[i] = tmp;
break;
}
Array[i] = Array[j]; //将(i+m)%n位置的元素移到第i个位置
i = j;//更新i,因为j位置以腾空,所以下一个要处理的就是j位置。在一个环内,一个个依次处理下去
}
}
}
int main() {
int number[MAXN], n, m;
int i;
scanf_s("%d %d", &n, &m);
for (i = 0; i < n; i++)
{
scanf_s("%d", number + i);
}
m %= n;//当m大于等于n时转化成等价的小于n的数
LeftShift(number, n, m);//循环左移m位
for (i = 0; i < n; i++)
{
if (i) printf(" ");
printf("%d", number[i]);
}
printf("\n");
return 0;
}