这是一道关于gcd的题目,还是需要仔细感受一下gcd中间代码的简洁与巧妙
要注意算法的优化,使得移动次数减少了gcd(n,m)倍
代码如下
#include<cstdio>
//最大公约数
int gcd(int a,int b){
if(b==0) return a;
else return gcd(b,a%b);
}
int main(){
int a[110];
int n,m,temp,pos,next;
//temp 临时变量 pos 当前位置 next 下一个准备处理的位置
scanf("%d %d",&n,&m);
for(int i = 0;i < n;i++){
scanf("%d",a+i);
}
m = m % n ;//修正m
if(m){
int d = gcd(n,m);
for(int i = n-m;i < n-m+d;i++){
temp = a[i];
pos = i;
do{
//计算next
next = (pos -m + n)%n;
//如果下个位置不是初始点
if(next!=i) a[pos] = a[next];
else a[pos] = temp;
pos = next;
}while(pos!=i);
}
}
for(int i = 0 ; i < n ;i ++){
printf("%d",a[i]);
if(i < n-1) printf(" ");
}
return 0 ;
}