WA20tps求调
查看原帖
WA20tps求调
1209829
Lhm2010楼主2025/1/19 13:58
#include <bits/stdc++.h>
using namespace std;
unsigned long long n;
const int p=1e9+7;
struct Mat{
	long long a[105][105];
	int r,c;
	Mat(int _r=0,int _c=0){
		r=_r;
		c=_c;
		memset(a,0,sizeof(a));
		if(c==0){
			c=r;
		}
	}
	void unit(){
		memset(a,0,sizeof(a));
		for(int i=1;i<=r;i++){
			a[i][i]=1;
		} 
	}
	Mat operator*(const Mat &t)const{
		Mat ans(r,t.c);
		int n=r,m=t.c;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				for(int k=1;k<=c;k++){
					ans.a[i][j]+=a[i][k]*t.a[k][j];
					ans.a[i][j]%=p;
				}
			}
		}
	}
	void input(){
		for(int i=1;i<=r;i++){
			for(int j=1;j<=c;j++){
				cin>>a[i][j];
			}
		}
	}
	void out(){
		for(int i=1;i<=r;i++){
			for(int j=1;j<=c;j++){
				cout<<a[i][j]<<" ";
			}
			cout<<"\n";
		}
	}
	Mat ksm(long long b){
		Mat ans(r);
		ans.unit();
		Mat a=*this;
		while(b!=0){
			if(b&1){
				ans=ans*a;
			}
			b>>=1;
			ans=a*a;
		}
		return ans;
	}
};
signed main(){
	cin>>n;
	if(n==1||n==2){
		cout<<"1";
		return 0;
	}
	Mat a(2);
	a.a[1][1]=0,a.a[1][2]=1;
	a.a[2][1]=1,a.a[2][2]=1;
	a=a.ksm(n-2);
	Mat ans(2);
	ans.a[1][1]=1,ans.a[1][2]=1;
	ans=ans*a;
	cout<<ans.a[1][2];
	return 0;
}

感谢大佬

2025/1/19 13:58
加载中...