就是递推公式的求解比较痛苦一些
a[n]=a[n-1]+5*a[n-2]+a[n-3]-a[n-4]
然后就可以直接对结构体矩阵进行快速幂的运算了。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
const int Maxn = 10;
int mm;
struct Matrix{
int n,m;
int a[Maxn][Maxn];
Matrix(){
memset(a,0,sizeof(a));
n=m=0;
}
void clear(){
memset(a,0,sizeof(a));
n=m=0;
}
Matrix operator *(const Matrix &b) const {
Matrix tmp;
tmp.clear();
tmp.n=n;
tmp.m=b.m;
for(int i=1;i<=n;i++){
for(int j=1;j<=b.m;j++)
for(int k=1;k<=m;k++)
tmp.a[i][j]=(tmp.a[i][j]+a[i][k]*b.a[k][j])%mm;
}
return tmp;
}
} a,base,ans;
void init(){
base.clear();
a.clear();
base.n=base.m=4;
base.a[1][4]=-1;
base.a[2][1]=1;
base.a[2][4]=1;
base.a[3][2]=1;
base.a[3][4]=5;
base.a[4][3]=1;
base.a[4][4]=1;
ans.n=1;
ans.m=4;
ans.a[1][1]=1;
ans.a[1][2]=5;
ans.a[1][3]=11;
ans.a[1][4]=36;
}
Matrix fun(int num){
if(num==1)return base;
Matrix tmp=fun(num/2);
tmp=tmp*tmp;
if(num%2==1)tmp=tmp*base;
return tmp;
}
int main()
{
int num;
while(scanf("%d%d",&num,&mm)!=EOF){
if(num==0&&mm==0)break;
init();
if(num<=4){printf("%d\n",ans.a[1][num]%mm);continue;}
a=fun(num-4);
ans=ans*a;
printf("%d\n",ans.a[1][4]%mm);
}
return 0;
}
本文详细介绍了如何通过递推公式求解复杂数学问题,并利用结构体矩阵快速幂运算提高计算效率。重点展示了快速幂运算在解决特定递推问题中的应用,包括初始化矩阵、构建矩阵乘法函数以及实现快速幂算法。此外,文章还提供了一个实例代码,帮助读者理解整个过程。
4060

被折叠的 条评论
为什么被折叠?



