F i b ( N ) m o d F i b ( K ) Fib(N)\ mod\ Fib(K) Fib(N) mod Fib(K)
Fib(N)表示斐波那契数列的第N项( F ( 0 ) = 0 , F ( 1 ) = 1 F(0) = 0, F(1) = 1 F(0)=0,F(1)=1),给出N和K,求 F i b ( N ) m o d F i b ( K ) Fib(N) mod Fib(K) Fib(N)modFib(K)。由于结果太大,输出 M o d 1000000007 Mod\ 1000000007 Mod 1000000007 的结果。
正 解 部 分 \color{red}{正解部分} 正解部分
首先要知道
F i = F k F i − k + 1 + F k − 1 F i − k F_i = F_kF_{i-k+1}+F_{k-1}F_{i-k} Fi=FkFi−k+1+Fk−1Fi−k,
在 m o d F k mod\ F_k mod Fk 意义下继续化简 ↓ \downarrow ↓
F i = F k − 1 F i − k = F k − 1 ( F k F i − 2 k + 1 + F k − 1 F i − k − k ) = F k − 1 2 F i − 2 k ​ ⋯ = F k − 1 ⌊ i k ⌋ F i % k F_i\\ = F_{k-1}F_{i-k}\\ = F_{k-1}(F_kF_{i-2k+1}+F_{k-1}F_{i-k-k})\\ = F_{k-1}^2F_{i-2k}\\ \ \dotsi \\ = F_{k-1}^{\lfloor \frac{i}{k} \rfloor}F_{i\%k} Fi=Fk−1Fi−k=Fk−1(FkFi−2k+1+Fk−1Fi−k−k)=Fk−12Fi−2k ⋯=Fk−1⌊ki⌋Fi%k
再要知道
F k − 1 2 + F k − 1 F k − F k 2 = ( − 1 ) k F_{k-1}^2+F_{k-1}F_{k}-F_k^2 = (-1)^k Fk−12+Fk−1Fk−Fk2=(−1)k
证 明 : 证明: 证明:
首先要知道 二 阶 行 列 式 二阶行列式 二阶行列式 的相关内容如下.
二 阶 行 列 式 二阶行列式 二阶行列式: d e t ( a b c d ) = a d − b c det \begin{pmatrix} a\ b \\ c\ d \end{pmatrix} =ad-bc det(a bc d)=ad−bc
再看斐波那契数列的转移矩阵如下,
[ 1 1 1 0 ] k = [ F k + 1 F k F k F k − 1 ] \begin{bmatrix} 1\ 1 \\ 1\ 0 \end{bmatrix}^k = \begin{bmatrix} F_{k+1}\ \ \ \ F_k \\ F_k\ \ \ \ \ F_{k-1} \end{bmatrix} [1 11 0]k=[Fk+1 FkFk Fk−1]
矩阵相等, 行列式也相等,
∴ ( − 1 ) k = F k + 1 F k − 1 − F k 2 = F k − 1 2 + F k − 1 F k − F k 2 \therefore (-1)^k \\ = F_{k+1}F_{k-1} - F_k^2\\ = F_{k-1}^2+F_{k-1}F_k-F_k^2 ∴(−1)k=Fk+1Fk−1−Fk2=Fk−12+Fk−1Fk−Fk2
得 证 得证 得证 .
所以在 m o d    F k \mod F_k modFk 意义下, ( − 1 ) k = F k − 1 2 (-1)^k=F_{k-1}^2 (−1)k=Fk−12 .
再看原式: F i = F k − 1 ⌊ i k ⌋ F i % k F_i = F_{k-1}^{\lfloor \frac{i}{k} \rfloor}F_{i\%k} Fi=Fk−1⌊ki⌋Fi%k
设 x = ⌊ i k ⌋ x= \lfloor \frac{i}{k} \rfloor x=⌊ki⌋, y = i % k y=i\%k y=i%k,
则 F i = F k − 1 x F y = { x & 1 = = 0 , ( − 1 ) x 2 k F y x & 1 = = 1 , ( − 1 ) ( x 2 + 1 ) k F y − k = ( − 1 ) ( x 2 + 1 ) k + k − y − 1 F k − y F_i = F_{k-1}^xF_{y}=\begin{cases} x\&1 == 0, \ \ \ (-1)^{\frac{x}{2}k} F_y\\ x\&1 == 1, \ \ \ (-1)^{(\frac{x}{2}+1)k} F_{y-k} = (-1)^{(\frac{x}{2}+1)k+k-y-1} F_{k-y} \end{cases} Fi=Fk−1xFy={x&1==0, (−1)2xkFyx&1==1, (−1)(2x+1)kFy−k=(−1)(2x+1)k+k−y−1Fk−y
其中 F y − k F_{y-k} Fy−k 可能为负数, 这里又要引入
斐 波 那 契 的 负 系 数 项 : F − i = ( − 1 ) i − 1 F i 斐波那契的负系数项:F_{-i} = (-1)^{i-1}F_i 斐波那契的负系数项:F−i=(−1)i−1Fi .
然后就可以 A C AC AC 辣 ! ! !
总结一下, 该题涉及的知识点有 ↓ ↓ ↓
- F i = F k F i − k + 1 + F k − 1 F i − k F_i = F_kF_{i-k+1}+F_{k-1}F_{i-k} Fi=FkFi−k+1+Fk−1Fi−k
- F k − 1 2 + F k − 1 F k − F k 2 = ( − 1 ) k F_{k-1}^2+F_{k-1}F_{k}-F_k^2 = (-1)^k Fk−12+Fk−1Fk−Fk2=(−1)k
- F − i = ( − 1 ) i − 1 F i F_{-i} = (-1)^{i-1}F_i F−i=(−1)i−1Fi
实 现 部 分 \color{red}{实现部分} 实现部分
#include<bits/stdc++.h>
#define reg register
typedef long long ll;
const int mod = 1e9 + 7;
ll N;
ll K;
struct Matrix{ int C[4][4]; Matrix(){ memset(C, 0, sizeof C); } };
Matrix modify(const Matrix &a, const Matrix &b){
Matrix s;
for(reg int i = 1; i <= 2; i ++)
for(reg int j = 1; j <= 2; j ++)
for(reg int k = 1; k <= 2; k ++){
int &t = s.C[i][j];
t = (1ll*t + (1ll*a.C[i][k]*b.C[k][j]%mod)) % mod;
}
return s;
}
Matrix ma_Ksm(Matrix a, ll b){
Matrix s;
for(reg int i = 1; i <= 2; i ++) s.C[i][i] = 1;
while(b){
if(b & 1) s = modify(s, a);
a = modify(a, a); b >>= 1;
}
return s;
}
ll get(ll k){
Matrix res, I;
res.C[1][1] = 1;
I.C[1][1] = I.C[1][2] = I.C[2][1] = 1;
I = ma_Ksm(I, k);
res = modify(res, I);
return res.C[1][2];
}
void Work(){
scanf("%lld%lld", &N, &K);
ll x = N/K, y = N%K;
if(x & 1){
x = (x+1)/2, y = K-y-1;
x = (K & 1) * x;
ll Ans = ((x+y&1)?-1:1) * get(y + 1);
if(Ans < 0) Ans = (Ans + get(K) + mod) % mod;
printf("%lld\n", Ans);
}else{
x >>= 1;
if(!(K&1)) x = 0;
ll Ans = ((x&1)?-1:1) * get(y);
if(Ans < 0) Ans = (Ans + get(K) + mod) % mod;
printf("%lld\n", Ans);
}
}
int main(){
freopen("fib.in", "r", stdin);
freopen("fib.out", "w", stdout);
int T; scanf("%d", &T);
while(T --) Work();
return 0;
}