Fibonacci 第 n 项
// Fibonacci 第 n 项.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://loj.ac/p/10220
题目描述
大家都知道 Fibonacci 数列吧,f_1=1,f_2=1,f_3=2,f_4=3,~~~,f_n=f_{n-1}+f_{n-2}。
现在问题很简单,输入 n 和 m,求 f_n mod m。
输入格式
输入 n,m。
输出格式
输出 f_n mod m。
样例
输入
5 1000
输出
5
数据范围与提示
对于 100\% 的数据, 1<= n <= 2* 10^9, 1<= m <= 10^9+10。
*/
#include <iostream>
#include <cstring>
using namespace std;
long long n, m;
long long A[2] = { 1,1 };
long long B[2][2] = {
{0,1},
{1,1},
};
long long R[2] = { 0,0 };
void mul(long long Z[2], long long X[2], long long Y[2][2]) {
memset(Z, 0, sizeof(Z)*2);
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
Z[i] += X[j] * Y[j][i];
Z[i] %= m;
}
}
}
void mul(long long ret[2][2], long long X[2][2], long long Y[2][2]) {
memset(ret, 0, sizeof(ret[0][0]) * 2 * 2);
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
ret[i][j] += X[i][k] * Y[k][j];
ret[i][j] %= m;
}
}
}
}
void mulrep(long long X[2][2], long long q) {
long long tmp[2][2]; memset(tmp, 0, sizeof tmp);
long long R[2][2]; memset(R, 0, sizeof R);
for (int i = 0; i < 2; i++) { R[i][i] = 1; }
long long RC[2][2]; memcpy(RC, R, sizeof RC);
while (q != 0) {
if (q & 1) {
memcpy(RC, R, sizeof RC);
mul(R, RC,X);
}
q >>= 1;
mul(tmp,X,X);
memcpy(X, tmp, sizeof tmp);
}
memcpy(X, R, sizeof R);
}
int main()
{
cin >> n;
m = 1e9 + 7;
mulrep(B, n -1);
long long ret[2];
mul(ret,A,B);
cout << ret[0] << endl;
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2020-08-30 LeetCode 557. 反转字符串中的单词 III 双指针
2019-08-30 acwing 60. 礼物的最大价值
2018-08-30 redis在游戏服务器中的使用初探(四) redis应用
2018-08-30 redis在游戏服务器中的使用初探(三) 信息存储
2016-08-30 操作系统学习笔记(一) 段权限转移规则