HDU P1005 Number Sequence

来源:互联网 发布:移动宽带网络连接不上 编辑:程序博客网 时间:2024/05/17 08:01

题目大意:

一副序列,f[1]=1,f[2]=1,以及一组数A,B,N
fi的递推式是fi=(fi-1*A+fi-2*B)对7取模
让你求出fn

给出多组a,b,n,以a=0,b=0,n=0结束输出
1 < = A、B < = 1000,1 < = n < = 100000000

题解:

找规律+数学:
这题一看数据就知道是找规律的题,不过找了好久,一开始是在想A,B的数量,
然后推了一些东东,如下
这里写图片描述
后来发现这样推下去找不到明显的规律,
后来经过一番深 dfs 虑,发现了一个重要的地方,
因为取模7,所以任意2个,[fi-1,fi]都在[0..6,0..6]这里面,即有49种可能,那么N里面则很明显会存在循环节,我们只需要把这个循环节找出来即可,
因为fi从fi-1,fi-2推来,所以[f1,f2]为[1,1]那么后面一旦出现了[fi-1,fi]=[1,1]则找到了循环节,
而因为只有49种可能,所以最多只需要枚举一下就可以将循环节找出来,
而结果fn就是f[(n-1) mod l+1],l为循环节长度…

var   f:Array [0..51] of longint;   i,a,b,n:longint;begin    readln(a,b,n);    while (a<>0) or (b<>0) or (n<>0) do    begin       f[1]:=1; f[2]:=1;       for i:=3 to 51 do        begin            f[i]:=(f[i-1]*a+f[i-2]*b) mod 7;            if (f[i]=-1) and (f[i-1]=-1) then                break;        end;        writeln(f[(n-1) mod i+1]);        readln(a,b,n);    end;end.