f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
可以看出几个数学性质
1. A 替换为 A%7 对结果无影响,也就是不管A取何值,只有7种可能
2. B 亦复如是
3. f(n)为周期性函数,因为f(n-1)最多只有7种可能,f(n-2)最多只有7种可能,因此f(n)的周期小于等于49
因此,最快的算法就是建立一个 [7][7][49] 的三维映射表,直接查表就行了,这应该是理论上最快的算法
太数学化不好,退而求其次,只考虑周期不超过49这一点,就可以在49步内直接预测到最终结果
可以看出几个数学性质
1. A 替换为 A%7 对结果无影响,也就是不管A取何值,只有7种可能
2. B 亦复如是
3. f(n)为周期性函数,因为f(n-1)最多只有7种可能,f(n-2)最多只有7种可能,因此f(n)的周期小于等于49
因此,最快的算法就是建立一个 [7][7][49] 的三维映射表,直接查表就行了,这应该是理论上最快的算法
太数学化不好,退而求其次,只考虑周期不超过49这一点,就可以在49步内直接预测到最终结果
程序代码:
#include <stdio.h> unsigned foo( unsigned A, unsigned B, unsigned n ) { unsigned buf[53] = { 0, 1, 1, (A+B)%7, (A*(A+B)+B)%7 }; if( n <= 4 ) return buf[n]; if( A%7==0 && B%7==0 ) return 0; for( unsigned i=5; i!=n+1; ++i ) { buf[i] = (A*buf[i-1] + B*buf[i-2]) % 7; if( buf[i]==buf[4] && buf[i-1]==buf[3] ) return buf[(n-2)%(i-4)+2]; } return buf[n]; } int main( void ) { for( unsigned A, B, n; scanf("%u%u%u",&A,&B,&n)==3 && !(A==0 && B==0 && n==0); ) printf( "%u\n", foo(A,B,n) ); return 0; }