//Arnold变换是一种常见的图像置乱技术,Arnold变换定义如下:
//对任意N*N矩阵(素有元素相同的矩阵除外)设i,j为矩阵元素的初始下标,经过Arnold变换后行下标为i',j',其满足下式
//i'=(i+j)mod N
//j =(i+2j)mod N
//i,j:0,1,2,...N-1
//输入说明:对输入的每一个N,给出N*N矩阵的Arnold变换的周期T
//输入样本:
//3
//8
//0
//输出样本
//4
//6
#include<iostream>
using namespace std;
int Arnold(int n){
int i=0,j=1,temp=0,num=0;//矩阵a(0,1)的值经过num次变换变回初始值,就是整个矩阵所有元素经过num次Arnold变换后变成原来的矩阵。
for(int k=0;k<=n*n/2;k++){ //二维及以上矩阵都有a(0,1)元素
if(i==0&&j==1)
{
if(num>0)
break;
}
else
temp=i;
i=(i+j)%n;
j=(temp+2*j)%n;
num++;
}
return num;
}
int main(){
int a,j=0,m=0;
int b[100];
while(1){
scanf("%d",&a);
if(a==0)
break;
b[j++]=a;
}
for(int k=0;k<j;k++){
m=Arnold(b[k]);
cout<<m<<endl;
}
system("pause");
return 0;
}