求助为啥矩阵快速幂会爆int
查看原帖
求助为啥矩阵快速幂会爆int
428889
Xile楼主2023/11/16 19:34

rt 80pts

#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int mod=1e9+7;

int Add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int Mul(int x,int y) {return 1ll*x*y%mod;}

char gc(){
	static char buf[1000000],*p1=buf,*p2=buf;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
//#define getchar gc
int read(){
	int x=0,f=0;char c=getchar();
	while(!isdigit(c)) f|=(c=='-'),c=getchar();
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return f?-x:x;	
}
void write(int x){
	if(x/10) write(x/10);
	putchar(x%10^48);
}
void print(int x){
	if(x<0) putchar('-'),x=-x;
	write(x);putchar('\n');
}
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b) 
#define debug cout<<"fuck"

struct Matrix{
	int v[3][3];
	Matrix(){
		memset(v,0,sizeof v);
	}
	Matrix operator *(const Matrix &b)const{
		Matrix sum;
		for(int i=1;i<=2;i++)
			for(int j=1;j<=2;j++)
				for(int k=1;k<=2;k++)
					sum.v[i][j]=Add(sum.v[i][j],Mul(v[i][k],b.v[k][j]));
		return sum;
	}
};

Matrix qpow(int y){
	Matrix ans,base;
	ans.v[1][1]=ans.v[1][2]=1;
	base.v[1][1]=base.v[1][2]=base.v[2][1]=1;
	for(;y;y>>=1,base=base*base) if(y&1) ans=ans*base;
	return ans;
}

signed main(){
	int n=read();
	if(n<=2) return puts("1")&&0;
	Matrix ans=qpow(n-2);
	print(ans.v[1][1]);
	return 0;
} 
2023/11/16 19:34
加载中...