快速求斐波那契數列(矩陣乘法+快速冪)


斐波那契數列

給你一個n;f(n)=f(n-1)+f(n-2)

請求出 f(f(n)),由於結果很大請

對答案 mod 10^9+7;

1<=n<=10^100;

 

用矩陣乘法+快速冪求斐波那契數列是經典應用;

矩陣公式 C i j=C i k *C k j;

根據遞推式 構造2*2矩陣;

原始矩陣

1 0

0 1

矩陣 2

1 1

1 0

原始矩陣與矩陣 2相乘達到轉化狀態效果;

對矩陣二進行快速冪 乘法;達到快速轉化矩陣的效果;

即使達到快速轉化狀態;那么大的數據范圍也很難求解;

高精?這有一種不用高精的方法;

打個暴力 求循環節;

即 f(f(n))%mod同余f(f(n%k)%p)%mod;

暴力求k p 即可;

k=6e9+6;p=2e9+2;

以下暴力程序

#include<cstdio>
typedef long long LL;
LL  f[100005],k;
int main(){
	f[1]=1;k=1;
	while (1){
		k++;
		f[2]=(f[1]+f[0])%1000000007;
		if (f[2]==2) {
			printf("%lld\n",k);
		}
		f[0]=f[1];
		f[1]=f[2];
	}
}

 AC 程序

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define mod 1000000007
#define ll long long 
int T,i,j,k;
ll n;
ll a[2][2],b[2][2],c[2][2],f[2][2];
char ch;
void Mod(ll mo)
{
	n=0;
	ll q=getchar();
	while(q<48||q>57)q=getchar();
	while(q>=48&q<=57)
	{
		n=(n*10+q-48)%mo;
		q=getchar();
	}
}
void mul(ll a[2][2],ll b[2][2],ll mo)
{
	ll c[2][2]={0};
	for(i=0;i<2;++i)
	for(j=0;j<2;++j)
	for(k=0;k<2;++k)
	c[i][j]=(c[i][j]+a[i][k]*b[k][j]%mo)%mo;
	for(i=0;i<2;++i)
	for(j=0;j<2;++j)
	a[i][j]=c[i][j];
}
int main()
{
//	freopen("xx.in","r",stdin);
//	freopen("xx.out","w",stdout);
	scanf("%d\n",&T);
	for(;T--;)
	{
		Mod(mod*6ll+6);
		if(n<=2)
		{
			if(!n)printf("0\n");
			else printf("1\n");
			continue;
		}
		n-=1;
		a[0][0]=a[0][1]=a[1][0]=1;a[1][1]=0;
		f[0][0]=f[1][1]=1;f[1][0]=f[0][1]=0;
		while(n)
		{
			if(n&1)mul(f,a,mod*2ll+2);
			mul(a,a,mod*2ll+2);
			n>>=1;
		}
		n=f[0][0]-1;
		a[0][0]=a[0][1]=a[1][0]=1;a[1][1]=0;
		f[0][0]=f[1][1]=1;f[1][0]=f[0][1]=0;
		while(n)
		{
			if(n&1)mul(f,a,mod);
			mul(a,a,mod);
			n>>=1;
		}
		printf("%d\n",f[0][0]);
	}
}

  

問題描述】

令𝑓(𝑛)為斐波那契數列第𝑛項,其中𝑓(0) = 0,𝑓(1) = 1,𝑓(𝑛) = 𝑓(𝑛− 1) +𝑓(𝑛 −2)。所以要干啥呢?求𝑓(𝑓(𝑛))。【輸入格式】第一行一個整數𝑇代表數據組數。接下來𝑇行每行一個整數𝑛。【輸出格式】𝑇行每行一個整數代表答案對10 9 + 7取模的值。【樣例輸入】40126【樣例輸出】01121【樣例解釋】無。【數據規模與約定】215 490。70%的數據,1 ≤ 𝑛 ≤ 10 5 。對於100%的數據,1 ≤ 𝑇 ≤ 10 3 ,1 ≤ 𝑛 ≤ 10 100 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM