2012、10、30 来到IMUT快两个月了,才发现自己真的该好好学习算法了,或许还不算晚!加油~~
这道题 囧了好久,原因两个:1、矩阵乘法现在也不会构造 2、不会寻找循环节
今天呢,心血来潮学了下如何找循环节,看来感觉还不错,没有想象中的那么难。
其实这道题就是斐波那契数列 % 7的简单题,但因为数据量比较大,所以要用到矩阵。
但既然是 % 7那就是有循环节的。
我们大致的估算下0--6 7个数字,按照组合数学的思想最多有49种组合,所以i<50就足够了。
有时间 再想想矩阵怎么建立。。。真心弱爆了。
直接贴代码:
#include<iostream>
#include<cstdio>
using namespace std;
int a,b,n,i;
int f[1000000]={0,1,1};
int main(){
while(~scanf("%d%d%d",&a,&b,&n)&&a+b+n){
for(i=3;i<=50;i++){
f[i]=(a*f[i-1]+b*f[i-2])%7;
if(f[i]==1&&f[i-1]==1) break;}
//如果有两个连着 =1,则后面的全部和前面相同,即出现了周期
//这时就没必要再进行下去了,跳出循环, i-2为周期
n=n%(i-2);
//把n对周期求模,当n = i-2时, n=0,此时本来应该取arr[i-2]的,所以把arr[0]=arr[i-2]
//也可以这样:
//if(n==0) n=i-2;
f[0]=f[i-2];
cout<<f[n]<<endl;}
return 0;
}
//自己编写个找循环节的程序 找到第1个便是15循环节