SSL 1244~1529~1530~1531 斐波那契数列{from(高精度)to(矩阵乘法)}

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82024884

题目

1244:斐波那契 F i b o n a c c i (Fibonacci) 的数列如下形式,输出 F i b o n a c c i Fibonacci 的第 N 1 < = N < = 200 N(1<=N<=200) 项。

1529:一个数为斐波那契数列的第 N N m o d   10000 mod\ 10000 ; ( 1 < n < 2 31 (1<n<2^{31})

1530:求斐波那契数列 f [ n ] = f [ n 1 ] + f [ n 2 ] + 1 f[n]=f[n-1]+f[n-2]+1 的第 N N 项. f [ 1 ] = 1 , f [ 2 ] = 1. n ( 1 < n < 2 31 1 ) , f[1]=1,f[2]=1.n(1<n<2^{31}-1) , N N 项的结果 m o d   9973 mod\ 9973

1531:求斐波那契数列 f [ n ] = f [ n 2 ] + f [ n 1 ] + n + 1 f[n]=f[n-2]+f[n-1]+n+1 的第 N N 项,其中 f [ 1 ] = 1 , f [ 2 ] : = 1. N ( 1 < N < n 2 31 1 ) f[1]=1,f[2]:=1.N(1<N<n2^{31}-1) ,第n项结果 m o d   9973 mod\ 9973


代码(code_1)

正常的斐波那契数列,刷刷高精度加法即可。

#include<cstdio>
#include<cstring>
using namespace std; 
int a[101],b[101],c[101],n,le=100; 
void gjd()
{
	int t=0;
	for(int i=1;i<=100;i++)	{
	  c[i]+=a[i]+b[i]+t; 
	  t=c[i]/10;
	  c[i]%=10;
	}
	memcpy(a,b,sizeof(b)); 
	memcpy(b,c,sizeof(c)); 
	memset(c,0,sizeof(c)); 
}
int main()
{
	scanf("%d",&n); a[1]=1; 
	for (int i=1;i<=n;i++) gjd(); 
	while (le&&!b[le]) le--; 
	for (int i=le;i>=1;i--) printf("%d",b[i]);
}

代码(code_2)

正常的矩阵乘法,跟https://blog.csdn.net/qq_39897867/article/details/82024689没有什么不同……

#include<cstdio>
#include<cstring>
#define WYC 10000
#define w 2
#define LL long long
#define rep(i,x,y) for(register int i=x;i<y;i++)
using namespace std; 
LL n,f[w],a[w][w],g[w]; 
void mull()
{
	LL c[w][w]={{0,0},{0,0}}; 
	rep(i,0,w) rep(j,0,w) rep(k,0,w)
	 c[i][j]=(c[i][j]+a[i][k]*a[k][j])%WYC; 
	memcpy(a,c,sizeof(c)); 
}
void mul()
{
	LL c[w]={0,0};  
	rep(j,0,w) rep(k,0,w)
	 c[j]=(c[j]+f[k]*a[k][j])%WYC; 
	memcpy(f,c,sizeof(c));
}
int main()
{
	scanf("%lld",&n);
	f[0]=0; f[1]=1; 
	a[0][0]=0; a[0][1]=1; a[1][0]=1; a[1][1]=1; 
	for(;n;mull(),n>>=1) if (n&1) mul(); 
	printf("%lld",f[0]%WYC); 
}

代码(code_3)

只在斐波那契数列上累加 1 1 ,找找规律,就会发现只需 f [ 0 ] 2 1 f[0]*2-1 即可。

#include<cstdio>
#include<cstring>
#define WYC 9973
#define w 2
#define LL long long
#define rep(i,x,y) for(register int i=x;i<y;i++)
using namespace std; 
LL n,f[w],a[w][w],g[w]; 
void mull()
{
	LL c[w][w]={{0,0},{0,0}}; 
	rep(i,0,w) rep(j,0,w) rep(k,0,w)
	 c[i][j]=(c[i][j]+a[i][k]*a[k][j])%WYC; 
	memcpy(a,c,sizeof(c)); 
}
void mul()
{
	LL c[w]={0,0};  
	rep(j,0,w) rep(k,0,w)
	 c[j]=(c[j]+f[k]*a[k][j])%WYC; 
	memcpy(f,c,sizeof(c));
}
int main()
{
	scanf("%lld",&n);
	f[0]=0; f[1]=1; 
	a[0][0]=0; a[0][1]=1; a[1][0]=1; a[1][1]=1; 
	for(;n;mull(),n>>=1) if (n&1) mul(); 
	printf("%lld",(f[0]*2-1)%WYC); 
}

代码(code_4)

这可能需要修改一下 A , B A,B 矩阵的形状了。

引用于:https://blog.csdn.net/xuxiayang

#include<cstdio>
#include<cstring>
#define WYC 9973
#define w 4
#define LL long long
#define rep(i,x,y) for(register int i=x;i<y;i++)
using namespace std; 
LL n,f[w]={1,1,3,1},a[w][w]={{0,1,0,0},{1,1,0,0},{0,1,1,0},{0,1,1,1}}; 
void mull()
{
	LL c[w][w]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; 
	rep(i,0,w) rep(j,0,w) rep(k,0,w)
	 c[i][j]=(c[i][j]+a[i][k]*a[k][j])%WYC; 
	memcpy(a,c,sizeof(c)); 
}
void mul()
{
	LL c[w]={0,0,0,0};  
	rep(j,0,w) rep(k,0,w)
	 c[j]=(c[j]+f[k]*a[k][j])%WYC; 
	memcpy(f,c,sizeof(c));
}
int main()
{
	scanf("%lld",&n);
	if(n<3) {printf("1");return 0;}
	n-=2;
	for(;n;mull(),n>>=1) if (n&1) mul(); 
	printf("%lld",f[1]); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/82024884