版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82024884
题目
1244:斐波那契 的数列如下形式,输出 的第 项。
1529:一个数为斐波那契数列的第 项 ;
1530:求斐波那契数列 的第 项. 第 项的结果
1531:求斐波那契数列 的第 项,其中 ,第n项结果
代码(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)
只在斐波那契数列上累加 ,找找规律,就会发现只需 即可。
#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)
这可能需要修改一下
矩阵的形状了。
引用于: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]);
}