矩阵快速幂 WA0pt 求调,玄关
查看原帖
矩阵快速幂 WA0pt 求调,玄关
926840
封禁用户楼主2023/9/1 19:40

rt,我采用的矩阵是这样的:

(fifi−1...fi−m+1)×(1100001000011000)\begin{pmatrix}f_i&f_{i-1}&...&f_{i-m+1}\end{pmatrix}\times\begin{pmatrix}1&1&0&0\\0&0&1&0\\0&0&0&1\\1&0&0&0\end{pmatrix}

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define Mod 1000000007
struct node{
	ll a[105][105];
	int n,m;
	node(){
		memset(a,0,sizeof(a));
	}
}a,b;
node read(int n,int m){
	node c;
	c.n=n,c.m=m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++) cin>>c.a[i][j];
	return c;
}
node operator*(node x,node y){
	node c;
	int n=x.n,m=x.m,q=y.m;
	c.n=n,c.m=q;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=q;j++)
			for(int k=1;k<=m;k++)
				c.a[i][j]=(c.a[i][j]+x.a[i][k]*y.a[k][j])%Mod;
	return c;
}
node operator^(node x,ll y){
	node c;c.n=c.m=x.n;
	for(int i=1;i<=c.n;i++) c.a[i][i]=1;
	while(y){
		if(y&1) c=c*x;
		x=x*x,y>>=1;
	}
	return c;
}
int main(){
	int m;
	ll n;
	cin>>n>>m;
	if(n<m){
		cout<<1;
		return 0;
	}
	b.n=b.m=m,b.a[1][1]=b.a[m][1]=1;
	for(int i=1;i<=m;i++) a.a[1][i]=1;
	for(int i=2;i<=m;i++) b.a[i-1][i]=1;
	a.n=1,a.m=m;
	a=a*(b^(n-m-1));
	cout<<a.a[1][1];
	return 0;
}
2023/9/1 19:40
加载中...