斐波那契数最小公因数性质:gcd(F[n],F[m])=F[gcd(n,m)]

本文详细探讨了斐波那契数列的递推关系F(n)=F(m)F(n-m+1)+F(m-1)F(n-m),并通过数学归纳法证明其正确性,并进一步证明了F(n)与F(n-1)的最大公约数始终为1。此外,文章还涉及了如何利用辗转相除法推导gcd(F(n),F(m))=F(gcd(n,m))的结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引理1

结论:F(n)=F(m)F(n−m+1)+F(m−1)F(n−m)

推导:

F(n)

=F(n−1)+F(n−2)

=2F(n−2)+F(n−3)

=3F(n−3)+2F(n−4)

=5F(n−4)+3F(n−5)

=⋯

=F(m)F(n−m+1)+F(m−1)F(n−m)

看出系数的规律了,2=1+1,3=2+1,5=3+2,……

用数学归纳法严谨证明一下:

1)当m=2时,F(n)=F(2)F(n−2+1)+F(2−1)F(n−2)=F(n−1)+F(n−2)成立。

2)设当m=k(2≤k≤n−2)时,F(n)=F(k)F(n−k+1)+F(k−1)F(n−k)成立。

又∵F(k−1)=F(k+1)−F(k)
∴F(n)=F(k)F(n−k+1)+[F(k+1)−F(k)]F(n−k)
即F(n)=F(k+1)F(n−k)+F(k)[F(n−k+1)−F(n−k)]
又∵F(n−k+1)−F(n−k)=F(n−k−1)
∴F(n)=F(k+1)F(n−k)+F(k)F(n−k−1),说明当m=k+1时等式也成立。

综上,F(n)=F(m)F(n−m+1)+F(m−1)F(n−m)对于[2,n−1]内的任意一个整数m都成立。

引理2

gcd(F(n),F(n−1))=1

根据gcd更相减损性质:gcd(a,b)=gcd(b,a−b)(a>b)

得gcd(F(n),F(n−1))=gcd(F(n−1),F(n)−F(n−1))=gcd(F(n−1),F(n−2))

不断套用上式得到gcd(F(n),F(n−1))=gcd(F(2),F(1))=1

 

证明gcd(F(n),F(m))=F(gcd(n,m))

由引理1可知gcd(F(n),F(m))=gcd(F(m)F(n−m+1)+F(m−1)F(n−m),F(m))(n>m)

而F(m)F(n−m+1)为F(m)的倍数,故gcd(F(n),F(m))=gcd(F(m−1)F(n−m),F(m)) (gcd的更相减损,可以消掉F(m)的倍数)

因为F(m),F(m−1)互质,于是gcd(F(n),F(m))=gcd(F(n−m),F(m))

递归上式,

gcd(F(n),F(m))=gcd(F(n−m),F(m))=gcd(F(n−m−m),F(m))=⋯=gcd(F(nmodm),F(m))

再递归上式,我们需要比较nmodm与m谁更大,用大的数mod小的数。这不就是辗转相除法求最大公约数吗?

于是gcd(F(n),F(m))=gcd(F(gcd(n,m)),F(gcd(n,m)))=F(gcd(n,m))

证毕。

 

如未声明转载,本文作者为 1024th(https://www.cnblogs.com/1024th/p/10897313.html

版权:原创文章采用「署名-非商业性使用-相同方式共享 4.0 国际」协议进行许可,转载文章另行声明许可证

# U501347 「Stoi2025」爱的飞行日记 ## 题目背景 ![](bilibili:BV1fx411N7bU?page=125) ## 题目描述 $t$ 组询问,每次询问给定正整 $n,m$,计算 $$\prod_{a_1=1}^{m}\prod_{a_2=1}^{m}\cdots\prod_{a_n=1}^{m}\operatorname{lcm}(f_{a_1},f_{a_2},\dots,f_{a_n})\bmod{37426667}$$ 的值。其中 $f_i$ 是斐波那契,满足 $f_1=f_2=1$,且 $f_i=f_{i-1}+f_{i-2},\forall n\ge3$。 ## 输入格式 第一行输入一个正整 $t$ 表示询问组。 接下来 $t$ 行,每行两个正整 $n,m$ 表示一次询问。 ## 输出格式 每次询问输出一行一个整表示答案。 ## 输入输出样例 #1 ### 输入 #1 ``` 2 1 3 2 3 ``` ### 输出 #1 ``` 2 32 ``` ## 说明/提示 #### 样例解释 对于第一组询问,有答案为 $f_1f_2f_3=1\times1\times2=2$。 对于第二组询问,当 $a_1,a_2\in\{1,2\}$ 时 $\operatorname{lcm}(f_{a_1},f_{a_2})=1$,否则 $\operatorname{lcm}(f_{a_1},f_{a_2})=2$。故答案为 $2^5=32$。 #### 据范围与限制 **本题采用捆绑测试,各 Subtask 的限制与分值如下。** | Subtask No. | $t\le$ | $n\le$ | $m\le$ | 分值 | | :-: | :-: | :-: | :-: | :-: | | $1$ | $1$ | $2$ | $2 \times 10^3$ | $13$ | | $2$ | $5$ | $2 \times 10^5$ | $2 \times 10^5$ | $24$ | | $3$ | $5$ | $2 \times 10^7$ | $2 \times 10^7$ | $36$ | | $4$ | $300$ | $2 \times 10^{17}$ | $2 \times 10^7$ | $27$ | 对于所有据,满足 $1 \le t \le 300, 1 \le n \le 2 \times 10^{17}, 1 \le m \le 2 \times 10^7$。 #include<bits/stdc++.h> #define md 37426667 #define int unsigned long long using namespace std; inline int in() { int k=0,f=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9') k=k*10+c-'0',c=getchar(); return k*f; } inline int out(int a) { if(a<0) putchar('-'),a=-a; if(a<10) putchar(a+'0'); else out(a/10),putchar(a%10+'0'); return 0; } inline int gcd(int a,int b) { while(b){ int t=b; b=a%b; a=t; } return a; } int lcm(int a,int b) { return (a/gcd(a,b))*b%md; } int fib[20000005]; main() { int t=in(); fib[1]=fib[2]=1; for(int i=3; i<=20000000;i++) fib[i]=(fib[i-1]+fib[i-2])%md; while(t--) { int n=in(),m=in(); int ans=1; if(n==1) for(int i=1; i<=m; i++) ans=(ans*fib[i])%md; else if(n==2) { for(int xx=1; xx<=m; xx++) { for(int yy=1; yy<=m; yy++) { ans=(ans*lcm(fib[xx],fib[yy]))%md; } } } out(ans%md); } }
最新发布
03-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值