UVA 11582 Colossal Fibonacci Numbers(数论)
给定a,b(0<=a,b<264)和正整数n(1<=n<=1000),求f(ab)modn,其中f(x)是斐波那契数列。
根据斐波那契数列的定义和模运算的性质可知:
有f(n) mod n=f(n-1) mod n+f(n-2) mod n,
不妨令F(n)=f(n) mod n
当<F(n-1),F(n)>二元组第二次出现时,前面的项构成了F(x)数列的最短循环节。之后只用求F(abmod L)即可,L为循环节长度,用快速幂来取模。
因为余数最多有n种,所以最多在n2项就会重复出现。
那么算法的时间复杂度为O(N2+logb)
可以证明循环节的第一和第二项组成的二元组一定是<F(0),F(1)>,
下面给出一个简易的证明:
假定循环节的第一二项不是<F(0),F(1)>,设其为<F(n-1),F(n)>。
下面来证明<F(0),F(1)>一定在<F(n-1),F(n)>出现第二次前出现过。
有F(n)=( F(n-1) + F(n-2) ) mod n
因为F(n-1)是给定的且ranF={0,1,…,n-1},所以F(n-2)是确定的且一定与<F(n-1),F(n)>第一次出现的位置的前一个相同 。
以此类推,可知<F(0),F(1)>在<F(n-1),F(n)>出现第二次前出现过。
十分粗略的证明,意会意会。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int max_n=1e6;
int f[max_n];
unsigned long long