#includeiostream
#includecstring
usingnamespacestd;
inthappen[7][7];//用来计算出现的位置
intmain()
{
intA,B,n;
intf1,f2,fn;
while(cinABn)
{
if(A==0
memset(happen,0,sizeof(happen));//初始化
f1=1;f2=1;//初始化
if(n==1||n==2)cout1endl;//特殊处理
else
{
for(inti=3;i=n;i)
{
if(happen[f1][f2]==0)//如果f1和f2以前没出现过
{
happen[f1][f2]=i;//记录第一次出现f1和f2的位置
fn=(A*f2B*f1)%7;//计算下一个数
//coutfn\"\";
f1=f2;//退一个
f2=fn;//退一个
}
else//如果f1和f2以前已经出现过
{
n=n-i;//算一下目标与现在的距离
n%=(i-happen[f1][f2]);//循环距离是i-之前记录的记录,把n缩短到1个循环距离以内,获得n的循环位置
n=i;//加上现在的i,获得下一个和n具有相同循环位置的下标
fn=(A*f2B*f1)%7;//计算下一个
f1=f2;//退一个
f2=fn;//退一个
}
}
coutfnendl;
}
}
}
|