校赛时的3题,我没怎么看,觉得规律题是可遇不可求的。今天看下,学习下规律题的做法。
还有之前的斐波那契数列。
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
遵循的规律如上。可知0<=F[n]<=6.所以(F[n-1],F[n-2])的范围在49以内。F[50];
第二步,找到循环点。比赛时之所以觉得难是因为变化的不仅仅是n,还有A和B如果A,B都考虑的话那得1000*1000种情况,有点多。但是其实只需做1,2组就可以看出规律:
(1,1) 便是F[]的循环节。
For(i=2;i<50;i++)
{
F[i]=(A*F[i-1]+B*F[i-2])%7;
If(F[i]==1&&F[i-1]==1)break;
}
找到循环节之后再将n对i-1取余,可求出F[n-1].
再进一步,既然F是个50个长度的数组,F[48]=F[49]=1;
#include<stdio.h>
int main()
{
long n,A,B,i,F[49];
F[0]=1;
while(scanf("%ld%ld%ld",&A,&B,&n))
{
if(A==0&&B==0&&n==0) break;
F[1]=1;F[2]=1;
for(i=3;i<49;i++)
F[i]=(A*F[i-1]+B*F[i-2])%7;
printf("%ld\n",F[n%48]);
}
}
本文详细介绍了如何解决规律题,并通过斐波那契数列实例展示了规律题解法的应用。文章深入探讨了规律题的解决策略,包括找到循环点和利用数组循环节来简化计算过程,同时解释了斐波那契数列的规律及其在实际问题中的应用。

145

被折叠的 条评论
为什么被折叠?



