题目大意&&思路:
矩阵快速幂: a b * f(n-1) f(n)
1 0 f(n-2) = f(n-1)
所以: ( a b )^(n-2) * f(2) = f(n) ( n>=3)
1 0 f(1) f(n-1)
所以求得基本矩阵的n-2次方后,在得到的矩阵当中第一项加上第二项即可 x*f(2)+y*(1)即:x+y;记得取模即可
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int aa,bb,n;
struct matrix
{
int a,b,c,d;
}ju,tmp,tmppp;
matrix fn(matrix k,matrix g)//模拟矩阵运算,用循环模拟也行
{
matrix kg;
kg.a=((k.a*g.a)%7+(k.b*g.c)%7 )%7; ///
kg.b=((k.a*g.b)%7+(k.b*g.d)%7 )%7;
kg.c=((k.c*g.a)%7+(k.d*g.c)%7 )%7;
kg.d=((k.c*g.b)%7+(k.d*g.d)%7 )%7;
return kg;
}
matrix qmod(int r)//快速幂
{
if(r==1)return ju;
tmp=qmod(r/2);
tmppp=fn(tmp,tmp);
if(r&1)return fn(tmppp,ju);
return tmppp;
}
int main()
{
while(cin>>aa>>bb>>n,n+aa+bb)
{
ju.a=aa;//初始化基本矩阵
ju.b=bb;
ju.c=1;
ju.d=0;
if(n==1||n==2){cout<<1<<endl;continue;}
matrix result=qmod(n-2);//记得指数n-2!!!
cout<<(result.a+result.b)%7<<endl;//最后这里记得要取模
}
//cin>>aa;
return 0;}
在网上溜达了一下,原来还可以找循环节
做题方法:
前是打表,就是打出一大堆数据,然后发现规率:
发现这道题是从f[1]=1,和f[2]=1开始,然后依次模7,就可知f[n]只有7种情况,而相数相邻只有7*7=49种
,所以从f[1]到f[49]必会出现相邻两个f[m-1]=1,f[m]=1,所以f[m]为周期函数,49为其一个周期;
代码如下:*/
#include<stdio.h>
int main()
{
int f[56],a,b,i;
f[0]=1;f[1]=1;
int n;
while(1)
{
scanf("%d%d%d",&a,&b,&n);
if(!a && !b && !n)
break;
for(i=2;i<49;i++)
f[i]=(a*f[i-1]+b*f[i-2])%7;
printf("%d\n",f[(n-1)%49]);
}
return 0;
}