codeforces 226 C 数论,利用Fibonacci数列的一个性质

输入p,l,r,k

1<=l<r<=10^12

给出fibonacci数列f[l],...,f[r]这一段,要从中拿出k个数,使得这k个数的gcd最大,输出ans%p

思路:

有(fib[i],fib[j]) = fib[(i,j)]

则(fib[i],fib[j],fib[k]) = fib[(i,j,k)]

由于fib数列递增,

实际上是要找最大的x,使得[l,r]中x的倍数>=k个,

即:r / x - (l - 1) / x >= k

枚举x,一段一段枚举,O(sqrt(r))级别

找到最大的x,再矩阵快速幂求fib[x] % p

p有可能是1,所以即使fib[x] = 1,也要输出fib[x] % p

 

posted on 2017-02-21 22:06  _fukua  阅读(172)  评论(0编辑  收藏  举报