1365 Fib(N) mod Fib(K) [斐波那契相关]

本文深入探讨了斐波那契数列的性质,包括递推公式、负系数项以及矩阵表示,详细解释了如何求解斐波那契数列中某项对另一项取模的问题,并提供了高效的算法实现。

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=FkFik+1+Fk1Fik,

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=Fk1Fik=Fk1(FkFi2k+1+Fk1Fikk)=Fk12Fi2k =Fk1kiFi%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 Fk12+Fk1FkFk2=(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)=adbc

再看斐波那契数列的转移矩阵如下,

[ 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     Fk1]

矩阵相等, 行列式也相等,

∴ ( − 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+1Fk1Fk2=Fk12+Fk1FkFk2

得 证 得证 .

所以在 m o d    F k \mod F_k modFk 意义下, ( − 1 ) k = F k − 1 2 (-1)^k=F_{k-1}^2 (1)k=Fk12 .


再看原式: F i = F k − 1 ⌊ i k ⌋ F i % k F_i = F_{k-1}^{\lfloor \frac{i}{k} \rfloor}F_{i\%k} Fi=Fk1kiFi%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=Fk1xFy={x&1==0,   (1)2xkFyx&1==1,   (1)(2x+1)kFyk=(1)(2x+1)k+ky1Fky


其中 F y − k F_{y-k} Fyk 可能为负数, 这里又要引入

斐 波 那 契 的 负 系 数 项 : F − i = ( − 1 ) i − 1 F i 斐波那契的负系数项:F_{-i} = (-1)^{i-1}F_i :Fi=(1)i1Fi .

然后就可以 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=FkFik+1+Fk1Fik
  • 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 Fk12+Fk1FkFk2=(1)k
  • F − i = ( − 1 ) i − 1 F i F_{-i} = (-1)^{i-1}F_i Fi=(1)i1Fi

实 现 部 分 \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;
}
//基础数学计算 //计算斐波那契数列第n个数(非递归) ll fibonacci1(in n) { if (n == 0) rt 0; if (n == 1) rt 1; ll prev = 0; ll curr = 1; ll next; for (in i = 2; i <= n; i++) { next = prev + curr; prev = curr; curr = next; } rt curr; } //计算斐波那契数列第n个数(仅递归) ll fibonacci2(in n) { if (n == 0) { rt 0; } else if (n == 1 || n == 2) { rt 1; } rt fibonacci2(n - 1) + fibonacci2(n - 2); } //计算斐波那契数列第n个数(递归;预存储;重复调用;取模;小n;越界MAX_L#-1) ll mem[MAX_L] = { 0 };in vis[MAX_L] = { 0 }; vd reset() {//初始化记忆数组 memset(vis, 0, sizeof(vis)); } ll fibonacci_mem(in n) {//(mod_add) if (n < 0 || n >= MAX_L) rt -1; if (n == 0) rt 0; if (n == 1) rt 1; if (vis[n]) rt mem[n]; mem[n] = mod_add(fibonacci_mem(n - 1), fibonacci_mem(n - 2)); vis[n] = 1; rt mem[n]; } //计算斐波那契数列第n个数(迭代;非存储;单次调用;取模;大n;越界MAX_L#-1) ll fib_iterative(in n) { if (n < 0 || n >= MAX_L) return -1; if (n == 0) return 0; if (n == 1) return 1; ll f0 = 0, f1 = 1; for (in i = 2; i <= n; ++i) { ll f2 = mod_add(f0, f1); f0 = f1; f1 = f2; } return f1; } //计算给定数n的阶乘(非递归;取模;错误#-1) ll factorial1(in n) { if (n < 0) rt - 1; ll result = 1; for (in i = 2; i <= n; i++) { result = ((result % MOD) * (i % MOD)) % MOD; } rt result; } //计算给定数n的阶乘(仅递归;取模) ll factorial2(in n) { if (n <= 1) { rt 1; } rt((n % MOD) * (factorial2(n - 1) % MOD)) % MOD; } //计算排列数P(对n排k;取模;错误#-1) ll Per(in n, in k) { if (k < 0 || n < 0 || k > n) { rt - 1; } ll result = 1; for (in i = n - k + 1; i <= n; i++) { result = (result * i) % MOD; } rt result; } //计算组合数C(对n组k;特殊;错误#-1) ll Com_sp(in n, in k) { if (k < 0 || n < 0 || k > n) { rt - 1; } if (k > n - k) { k = n - k; } ll result = 1; for (in i = 0; i < k; i++) { result = result * (static_cast<long long>(n) - i) / (static_cast<long long>(i) + 1); } rt result; } //计算幂次(快速幂)(base的exp次方;取模) ll pow_mod(ll base, ll exp) { ll result = 1; while (exp > 0) { if (exp & 1) { result = (result * base) % MOD; } base = (base * base) % MOD; exp >>= 1; } rt result; } //计算二元最大公因数(绝对值) ll gcd2(ll a, ll b) { if (a < 0) a = -a; if (b < 0) b = -b; while (b != 0) { ll temp = b; b = a % b; a = temp; } rt a; } //计算三元最大公因数(嵌gcd2) ll gcd3(ll a, ll b, ll c) { rt gcd2(gcd2(a, b), c); } //计算n元最大公因数(数组[1,n);嵌gcd2) ll gcdn(ll arr[], in n) { if (n == 0) rt 0; ll result = arr[0]; for (in i = 1; i < n; ++i) { result = gcd2(result, arr[i]); if (result == 1) br; } rt result; } //计算二元最小公倍数(嵌gcd2) ll lcm2(ll a, ll b) { if (a == 0 || b == 0) rt 0; ll ga = a < 0 ? -a : a; ll gb = b < 0 ? -b : b; ll g = gcd2(ga, gb); rt ga / g * gb; } //计算三元最小公倍数(嵌lcm2) ll lcm3(ll a, ll b, ll c) { rt lcm2(lcm2(a, b), c); } //计算n元最小公倍数(数组[1,n);嵌lcm2) ll lcmn(ll arr[], in n) { if (n == 0) rt 1; ll result = arr[0]; for (in i = 1; i < n; ++i) { result = lcm2(result, arr[i]); if (result == 0) br; } rt result; } //计算n元最小公倍数(数组[1,n);嵌lcm2;取模) ll lcmn_mod(ll arr[], in n) { if (n == 0) rt 1; ll result = arr[0]; for (in i = 1; i < n; ++i) { result = lcm2(result, arr[i]); if (result == 0) br; result %= MOD; } rt result; } //计算模加法/减法 ll norm(ll x) {//工具函数(映射到[0,MOD-1];处理负数) rt (x % MOD + MOD) % MOD; } ll mod_add(ll a, ll b) {//模加法 rt norm(a + b); } ll mod_sub(ll a, ll b) {//模减法 rt norm(a - b); } //计算模乘法(快速版) ll mod_qmul(ll a, ll b) { a %= MOD; b %= MOD; ll res = 0; while (b > 0) { if (b & 1) { res = (res + a) % MOD; } a = (a << 1) % MOD; b >>= 1; } rt res; } //计算模乘法(基础版) ll mod_fmul(ll a, ll b) { rt ((a % MOD) * (b % MOD)) % MOD; }
11-30
独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)内容概要:本文围绕“独立储能的现货电能量与调频辅助服务市场出清协调机制”展开,提出了一种基于Matlab代码实现的优化模型,旨在协调独立储能系统在电力现货市场与调频辅助服务市场中的联合出清问题。文中结合鲁棒优化、大M法和C&CG算法处理不确定性因素,构建了多市场耦合的双层或两阶段优化框架,实现了储能资源在能量市场和辅助服务市场间的最优分配。研究涵盖了市场出清机制设计、储能运行策略建模、不确定性建模及求解算法实现,并通过Matlab仿真验证了所提方法的有效性和经济性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事电力市场、储能调度相关工作的工程技术人员。; 使用场景及目标:①用于研究独立储能在多电力市场环境下的协同优化运行机制;②支撑电力市场机制设计、储能参与市场的竞价策略分析及政策仿真;③为学术论文复现、课题研究和技术开发提供可运行的代码参考。; 阅读建议:建议读者结合文档中提供的Matlab代码与算法原理同步学习,重点关注模型构建逻辑、不确定性处理方式及C&CG算法的具体实现步骤,宜在掌握基础优化理论的前提下进行深入研读与仿真调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值