数学序列
【问题描述】
已知一个函数f:
f(1)=1
f(2)=1
f(n)=(a×f(n-1)+b×f(n-2))mod7
现给出a,b,n,要你求出f(n).
【输入文件】
每一行输入一组数据分别为A,B,N(1<=A,B<=1000,1<=N<=200000000)
【输出文件】
每一行输出结果f(n).
【输入样例】
113
1210
【输出样例】
2
5
=====================
利用矩阵乘法+快速幂
============================
var
a,b,n:longint;
jz:array[1..2,1..2]of longint;
procedure init;
begin
assign(input,'number.in');
assign(output,'number.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure quick(a:longint);
var
jz_a,jz_n,jz_a1:array[1..2,1..2]of longint;
begin
jz_a:=jz;
jz[1,1]:=1; jz[1,2]:=0;
jz[2,1]:=0; jz[2,2]:=1;
while a>0 do
begin
if a and 1=1 then
begin
jz_n[1,1]:=(jz_a[1,1]*jz[1,1]+jz_a[1,2]*jz[2,1])mod 7;
jz_n[1,2]:=(jz_a[1,1]*jz[1,2]+jz_a[1,2]*jz[2,2])mod 7;
jz_n[2,1]:=(jz_a[2,1]*jz[1,1]+jz_a[2,2]*jz[2,1])mod 7;
jz_n[2,2]:=(jz_a[2,1]*jz[1,2]+jz_a[2,2]*jz[2,2])mod 7;
jz:=jz_n;
end;
jz_a1[1,1]:=(jz_a[1,1]*jz_a[1,1]+jz_a[1,2]*jz_a[2,1])mod 7;
jz_a1[1,2]:=(jz_a[1,1]*jz_a[1,2]+jz_a[1,2]*jz_a[2,2])mod 7;
jz_a1[2,1]:=(jz_a[2,1]*jz_a[1,1]+jz_a[2,2]*jz_a[2,1])mod 7;
jz_a1[2,2]:=(jz_a[2,1]*jz_a[1,2]+jz_a[2,2]*jz_a[2,2])mod 7;
jz_a:=jz_a1;
a:=a shr 1;
end;
end;
procedure main;
begin
while not eof do
begin
readln(a,b,n);
jz[1,1]:=0; jz[1,2]:=1;
jz[2,1]:=b; jz[2,2]:=a;
if n<=2 then begin writeln(1); terminate; end
else begin
n:=n-2;
quick(n);
end;
writeln((jz[2,1]+jz[2,2])mod 7);
end;
end;
begin
init;
main;
terminate;
end.