(转载)广义Fibonacci数列找循环节(心得+知识总结)

51nod1195斐波那契数列的循环节 求 Fib 数模 n 的循环节: 1. 对 n 做因数分解: n=p1^e1 * p2^e2 * … * pt^et; 2. 求出每个素数 pi 对应 Fib 数模 pi 的循环节mi0 ,则 pi^ei 对应的 Fib 数模 pi^ei 的 循环节 mi=mi0 * pi^(ei-1); 3. Fib 数模 n 的循环节就等于 lcm(mi)。 关键在于如何求Fib 数模素数 pi 阅读详情

思路来源

https://blog.youkuaiyun.com/acdreamers/article/details/10983813(Fib数模n的循环节的长度,可参考51nod 1195)

https://blog.youkuaiyun.com/ACdreamers/article/details/25616461(广义Fibonacci数列找循环节)

知识整理

求Fib数模n的最小循环节的长度的方法:

1.把n素因子分解,即

2.分别计算Fib数模每个的循环节长度,假设长度分别是

 

Fib数模的最小循环节长度等于,

其中表示Fib数模素数的最小循环节长度。

 

求的方法论:(详细证明见第二篇博文)

设,那么分情况讨论,注意p为奇素数,需特判p==2

①是模的二次剩余时,枚举的因子

②是模的二次非剩余时,枚举的因子

③找最小的因子,使得

 

成立。

3.Fib模n的循环节长度

 

求Fib数模n的循环节(非最小)的长度的方法:

注意到,上述方法中,无论何种情况,一定是(p+1)(p-1)的因子

那么,Fib数模p_{i}^{m}的循环节长度x_{i},一定是(p+1)(p-1)*p^{m-1}的因子,暴力的做法

ans=(x_{1},x_{2},...,x_{k})即为所求,也不求lcm了,循环节最多变为原数的完全平方倍

 

例题

2019牛客暑期多校训练营(第五场)B.generator 1

求广义Fibonacci数列的1e(1e6)项%mod的值,mod在(1e9,2e9]之间

法一:变二进制矩阵快速幂为十进制矩阵快速幂,每一位进行一次快速幂

法二:求循环节,将1e(1e6)模循环节化为ll可表示的幂次,再进行快速幂

代码1(十进制矩阵快速幂)

减少取模次数,可以卡过,也可以用2 4 8的倍增 用8+2 去凑10次 就不用写快速幂了

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 2;
const int N=1e6+10;
typedef long long ll;
int MOD;
char s[N];
ll x0,x1,a,b;
struct mat {
    ll c[MAXN][MAXN];
    int m, n;
    mat(){
    	memset(c, 0, sizeof(c));
    	m=n=MAXN;
    } 
    mat(int a, int b) : m(a), n(b) {
        memset(c, 0, sizeof(c));
    }
    void clear(){
		memset(c, 0, sizeof(c)); 
    }
    mat operator * (const mat& temp) {
        mat ans(m, temp.n);
        for (int i = 0; i < m; i ++)
            for (int j = 0; j < temp.n; j ++)
            {
                for (int k = 0; k < n; k ++)
                    ans.c[i][j] += c[i][k] * temp.c[k][j];
                ans.c[i][j]%=MOD;
            }
        return ans;
    }
    friend mat operator ^(mat M, int n) 
	{
   		 mat ans(M.m, M.m);
    	for (int i = 0; i < M.m; i ++)
        ans.c[i][i] = 1; 
   		 while (n > 0) {
        if (n & 1) ans = ans * M;
        M = M * M;
        n >>= 1;
    	}
    return ans;
	}
}bs,res;

int main()
{
	scanf("%lld%lld%lld%lld",&x0,&x1,&a,&b);
	scanf("%s%d",s,&MOD);
	bs.c[0][0]=a;bs.c[0][1]=b;
	bs.c[1][0]=1;
	res.c[0][0]=res.c[1][1]=1;
	int len=strlen(s);
	ll now=0;
	for(int i=len-1;i>=0;--i)
	{
		int v=s[i]-'0';
		res=res*(bs^v);//res*s[i]倍的基底 
		bs=bs^10;//基底扩大为原来10次方的基底 
	}
	printf("%lld\n",(res.c[1][0]*x1%MOD+res.c[1][1]*x0%MOD)%MOD); 
	return 0;
}

代码2(广义Fibonacci循环节)

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 45000
typedef __int128 LL;
const int M=1e6+10;
LL f0,f1,a,b;
LL N,P;
LL prime[maxn];
LL fac[maxn];
char s[M];
inline __int128 read()
{
   long long X=0,w=0; char ch=0;
   while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
   while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
   return w?-X:X;
}
inline void print(__int128 x)
{  
   if(x<0){putchar('-');x=-x;}
   if(x>9) print(x/10);
   putchar(x%10+'0');
}
void Prime(){
    memset(prime,0,sizeof(prime));
    for(int i=2;i<maxn;i++){
        if(!prime[i]) prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<maxn/i;j++){
            prime[prime[j]*i]=1;
            if(i%prime[j]==0){
                break;
            }
        }
    }
}
LL factor[130][2];
int fatcnt;
int get_factors(LL n){
    fatcnt=0;
    LL tmp=n;
    for(int i=1;prime[i]<=tmp/prime[i];i++){
        factor[fatcnt][1]=0;
        if(tmp%prime[i]==0){
            factor[fatcnt][0]=prime[i];
            while(tmp%prime[i]==0){
                tmp/=prime[i];
                factor[fatcnt][1]++;
            }
            fatcnt++;
        }
    }
    if(tmp!=1){
        factor[fatcnt][0]=tmp;
        factor[fatcnt][1]=1;
        fatcnt++;
    }
    return fatcnt;
}
LL gcd(LL a,LL b){
    if(b==0){
        return a;
    }
    else{
        return gcd(b,a%b);
    }
}
LL lcm(LL a,LL b){
    return a/gcd(a,b)*b;
}
struct Matrix{
    LL m[2][2];
}E,D;
Matrix Multi(Matrix A,Matrix B,LL mod){
    Matrix ans;
    for(int i=0;i<2;i++){
        for(int j=0;j<2;j++){
            ans.m[i][j]=0;
            for(int k=0;k<2;k++){
                ans.m[i][j]+=(A.m[i][k]*B.m[k][j])%mod;
                if(ans.m[i][j]>=mod){
                    ans.m[i][j]-=mod;
                }
            }
        }
    }
    return ans;
}
void init(){
    memset(E.m,0,sizeof(E.m));
    memset(D.m,0,sizeof(D.m));
    D.m[0][0]=a;D.m[0][1]=b;
    D.m[1][0]=1;
    for(int i=0;i<2;i++){
        E.m[i][i]=1;
    }
    Prime();
}
Matrix Pow(Matrix A,LL e,LL mod){
    Matrix ans=E;
    while(e){
        if(e&1){
            ans=Multi(ans,A,mod);
        }
        A=Multi(A,A,mod);
        e>>=1;
    }
    return ans;
}
LL Pow(LL a,LL b,LL mod){
    LL ans=1;
    while(b){
        if(b&1){
            ans=(ans*a)%mod;
        }
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}
LL get_fib(LL n,LL mod)
{
    if(mod==1) return 0;
    if(n==0)return f0%mod;
    Matrix ans=Pow(D,n-1,mod);
    return (ans.m[0][0]*f1%mod+ans.m[0][1]*f0%mod)%mod;
}
LL find_loop(LL n)
{
    get_factors(n);
    LL ans=1;
    for(int i=0;i<fatcnt;i++)
    {
        LL record=(factor[i][0]+1)*(factor[i][0]-1);
        for(int j=1;j<factor[i][1];j++)
        record*=factor[i][0];
        //printf("record:");print(record);puts("");
        if(record)ans=ans*record;
    }
    //printf("ans:");print(ans);puts("");
    return ans;
}
int main()
{
        f0=read();//print(f0);puts("");
        f1=read();//print(f1);puts("");
        a=read();//print(a);puts("");
        b=read();//print(b);puts("");
        init();
        scanf("%s",s);
        P=read();
        LL mod2=find_loop(P);
        //printf("mod2:");print(mod2);puts("");
        int len=strlen(s);
        for(int i=0;i<len;++i)
        N=(N*10+(s[i]-'0'))%mod2;
        N=get_fib(N,P);
        print(N);
        puts("");
        return 0;
}
/*
1315 521 20185 5452831
999 1000000008
 */

 

Fibonacci的【兔子数列】 以及 【狐狸找兔子】的问题 及 算法! Fibonacci的【兔子数列】和 变形约瑟夫环的【狐狸找兔子】,台阶问题 1,有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 兔子的规律为数列1,1,2,3,5,8,13,21.... #include int main(void) { long f1,f2; int i, k 阅读详情

相关推荐

用FIBONACCI数列表示任意正整数

已知FIBONACCI数列的定义为:F1 = 1, F2 = 1, n &gt; 2时, Fn = Fn - 1 + Fn - 2,请编程验证:任意的正整数可表示为若干个不同的FIBONACCI数之和。例如,45可以表示为45 = 34 + 8 + 3(即F9 + F5 + F3) 输入:重复地从键盘上读入一个正整数N(&lt;=10000) 输出:将其表示为不同的FIBONACCI数之和。 ...

子生的博客 1527

求斐波那契数列循环节

当斐波那契数列%mod时一定存在一个循环节,根据鸽巢原理,mod*(mod-1)一定是一个循环节,但不一定是最短的。 然后求斐波那契数列%n的循环节时,先把n质因数分解, n=p1a1* p2a2*…*pkak, 然后循环节就是每个pa 的循环节的最小公倍数,pa的循环节即为num[p]*pow(p,a-1),num[p]是p的循环节。 即为num[p1] pow(p1,a1-1)与num[p2]...

EDGiboy的博客 827

C语言Fibonacci 数列

功能是:求 Fibonacci 数列中大于 t 的小的一个数,结果由函数返回。其中 Fibonacci 数列 F(n)的定义为: F(0)=0,F(1)=1 F(n)=F(n-1)+F(n-2) 最后调用函数writeDat()读取50个数据t,分别得出结果且把结果输出到文件out.dat中。 例如:当 t=1000 时,函数值为:1597。 #include <stdio.h> in...

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1545

UVA11582- Colossal Fibonacci Numbers! 斐波那契数列循环节问题

题目意思很简单,给定a、b、n,求斐波那契数列第ab项模n的值,那么如何考虑呢? 首先我们应该知道求斐波那契数列的任意一项可以使用矩阵快速幂,速度很快,但是对于这道题,由于a和b都非常大,所以不能使用这种方法,考虑到最后都要模一个n,考虑斐波那契数列会出现循环节,如果要问为什么,因为斐波那契数列连续两项和等于后一项,所以如果出现和最开始相同的两项,那么就说明找到了循环的位置,而且这循环节一定存在 所以可以看出随着n的不同,斐波那契循环节在发生变化,且对于每一个n应该有唯一一个循环节,那么就可以 ...

ComingLiu的博客 247

DSP28335做FFT傅里叶变换

1. 看了一下例程,居然没有FFT的例程,难道这个DSP28335不能做FFT吗?对了C2000系列是有C2000 ware这个库的。方便很多,不过目前不确定在C5000上运行的FFT能直接迁移到DSP28335上行不?测试了一下,是可以的,因为都是用的math.h,下面的一些正弦函数基本一样的 2. 硬件简介,其中DSP28335和TLV320AIC23B之间使用I2C接口进行寄存器配置,...

weixin_30390075的博客 3332

联想ThinkPad声卡驱动安装避坑指南:从E470到X1 Carbon的通用解法

本文详细介绍了ThinkPad声卡驱动安装的全流程,从硬件识别到驱动获取、安装技巧及深度排错。涵盖E470到X1 Carbon等不同机型的通用解法,帮助用户解决音频驱动问题,提升使用体验。重点讲解了声音驱动的精准识别和安装策略,确保系统稳定运行。

weixin_29207439的博客 711

斐波那契循环节

斐波那契循环节 从一道题引出一个算法:斐波那契数列 这道题并没有什么花里胡哨的条件,就是很简单的计算\(F(n)\ mod\ p\)。 但是这题的\(n\)达到了\(10^{30000000}\)级别,很显然不能直接用矩阵快速幂做。 因此我们要引入一个概念:斐波那契循环节。 显而易见的是通过看题解我们知道,斐波那契数列在模一个数时会出现循环,而这个周期的长度就称为斐波那契循环节。 所以我...

ding4440的博客 2616

从零构建智能ai语音助手:ESP32s3+Python+大语言模型实战指南

本文详细介绍了基于ESP32S3硬件和Python后端的智能语音助手系统开发指南。系统采用ESP32S3采集语音,通过WebSocket实时传输到Python后端处理,利用大语言模型实现自然语言理解和意图识别,再通过TTS合成语音返回。文章从系统架构、工作流程、技术实现(包括OPUS编码、WebSocket通信、ESP32音频处理)等方面进行了详细讲解,并提供了分阶段学习路线和常见问题解决方案。该项目展示了物联网技术与AI技术的融合应用,相比传统语音系统具有更高的灵活性和智能性,为开发者提供了完整的实现方案

Despacito0o的博客 2630

斐波那契数列对任意值取模都有循环节吗?

【问答】 问:UVA10229,输出斐波那契数列第n项对2^m取模的值。我看到有用循环数列计算的题解,之前也遇到过类似斐波那契数列求循环节的题目,所以想问一下在什么情况下,斐波那契数列存在循环节呢? 636f6c696e答:这其实是个数学问题,答案是必然存在。 对于斐波那契数列a[n]对m取模,由于斐波那契数列的特征,只要存在a[j]modm=a[k]modm且a[j+1]mod...

菜鸡成长史 1890

瑞芯微RK3576上手实测:8nm新U配6TOPS NPU,做AIoT项目选它还是RK3588/RK3568?

本文深度评测瑞芯微RK3576芯片在中高端AIoT项目中的表现,对比RK3588和RK3568的性能差异。RK3576采用8nm工艺,配备6TOPS NPU,在解码能力、AI推理效率和功耗控制方面表现均衡,是中端项目的黄金选择。实测数据显示其在多路视频解码和AI加速性能上优势明显,特别适合智能摄像头和工业HMI设备。

weixin_42627853的博客 717

C++坦克大战源代码

【代码】C++坦克大战源代码。

强国豪,林中霖 2610

广义Fibonacci数列找循环节

今天将来学习如何求广义Fibonacci数列的循环节。   问题:给定,满足,求的循环      节长度。   来源:http://acdreamoj.sinaapp.com/ 1075题   分析:我们知道矩阵的递推关系如下               然后继续有               那么,现在的问题就转化为求最小的,使得

ACdreamer 1万+

PX4从放弃到精通(二十七):固定翼姿态控制

固件版本 PX4 1.13.2欢迎交流学习,可加左侧名片。

超维空间科技的博客 6892

广义Fibonacci数列找循环节 学习笔记

遇到了2019ICPC南昌赛区的网络赛的一道题,fn=3*fn-1+2*fn-2,有多次询问求fn。总结起来其实就是在模P意义下,O(1)回答广义斐波那契额数列的第n项,可以说是一道模板题了。 这道题的解法有两种:①求出通项公式之后,用二次剩余+优化快速幂(可以k进制快速幂或者把快速幂分块)解决。②求出模P意义下的递推结果的循环节,然后给矩阵分块加速递推。 看到大佬说方法一因为受到二...

weixin_30508241的博客 351

使用 MATLAB/Simulink 构建一个 核电站汽轮机与发电机协调控制系统 的仿真模型

在核电机组中,汽轮机-发电机系统是将核能最终转化为电能的关键环节。与火电机组不同,核反应堆的热惯性大、功率调节慢,因此汽轮机的控制策略需与反应堆特性相匹配,实现安全、稳定、高效的能量转换。维持发电机输出功率/频率稳定(响应电网调度)调节汽轮机进汽压力(匹配一回路蒸汽供应)实现“堆-机协调控制”保障机组在启停、变负荷、甩负荷等工况下的安全性本教程将带你使用构建一个核电站汽轮机与发电机协调控制系统汽轮机调速系统(调门控制)建模发电机与电网接口建模(同步机)

xiaoheshang_123的博客 189

RK+linux教程:RK3588 RGA硬件加速在YOLOv5图像预处理中的深度应用教程

摘要: 本教程深入解析了RK3588芯片的RGA硬件加速器在YOLOv5图像预处理中的应用。通过专用硬件设计,RGA支持图像缩放、边界填充等核心操作,结合零拷贝技术显著提升处理效率。重点分析了LetterBox算法的RGA实现,包括参数计算、边界填充和性能优化,并与传统CPU处理对比,展示了RGA在高分辨率图像处理中的优势。教程还提供了统一的预处理接口设计,便于在OpenCV与RGA方案间灵活切换,为RK3588平台的深度学习部署提供实用优化方案。

LXY_LOVE36的博客 977

广义Fibonacci循环节

广义Fibonacci循环节 拖更qwq 传送门 // f(n) = a * f(n - 1) + b * f(n - 2); // f(1) = c, f(2) = d // 可忽略 // 求f(n)mod p循环节长度 //c = a * a + 4b是模p的二次剩余时,枚举n = p - 1的因子 // 否则 枚举n=(p+1)(p-1)的因子 // 这里 p = 1000000007 #include <iostream> #include <cstdio> #in

Harris-H的博客 340

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

求Fibonacci数列的循环节

 求Fibonacci数列的循环节 Mathematics, by zimpha.   距离上一篇指数循环节貌似过了好几天了,今天就来写一下如何求解Fibonacci数列循环节,这个循环节当然是指模一个数的条件下,然后我会介绍如何求广义Fibonacci数列的循环节。 我们先来看第一部分。 Fibonacci数列循环节 首先,我们知道Fibonacci数列的递推公式是:

8rfuz的博客 1459

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MATLAB实例:Fibonacci数列

MATLAB实例一: 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ...

qq_42916979的博客 8717

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

特征根法求通项+广义Fibonacci数列找循环节 - HDU 5451 Best Solver

Best Solver Problem's Link   Mean:  给出x和M,求:(5+2√6)^(1+2x)的值。x analyse: 这题需要用到高中的数学知识点:特征根法求递推数列通项公式。 方法是这样的: 对于这题的解法: 记λ1=5+2√6,λ2=5-2√6,则λ1λ2=1,λ1+λ2=10

北岛知寒 630

[HDU 5451] Best Solver (向下取整+矩阵快速幂+广义Fibonacci降幂)

HDU - 5451 y=(5+26√)1+2xy = (5+2\sqrt{6})^{1+2^x} 给定 xx和 质数MM,求 ⌊y⌋%M\lfloor y\rfloor\%M 首先 xx很大,肯定要快速幂一下 有一个向下取整,所以要把底数配成整数 设 An=(5+26√)n+(5−26√)nA_n = (5+2\sqrt{6})^n + (5-2\sqrt{6})^n 可以发现,A

MisDeer's blog 840

Fibonacci数列 递归实现

Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 第n个Fibonacci数可递归地计算如下: int fibonacci(int n){ if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); } #in...

Summer_Xin的博客 2138

hdu 2818 Interesting Fibonacci 斐波那契 循环节

传送门 题目大意:就是给你两个函数,一个是F(n) = F(n-1) + F(n-2), F(0) = 0, F(1) = 1; 另一个是 G(n) = G(n-1)^F(a^b); G(1) = F(a^b); 求G(n) % c; 范围:A, B, N, C (10<=A, B<2^64, 2<=N<2^64, 1<=C<=300) 注意了:c的范围是1...

henucm的博客 359
上一篇: 矩阵快速幂(板子总结)
下一篇: 2019牛客暑期多校训练营(第五场)F.maximum clique 1(二分图最大独立集)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值