80分,2WA,10MLE?
查看原帖
80分,2WA,10MLE?
635829
D_FANG楼主2022/10/4 22:43
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define ll long long
using namespace std;
const ll mo=1000000007;
int read(){
	int x=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9'){
		if (c=='-') f=-1;
		c=getchar();
	}
	while (c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
struct maritx{
	long long n=0,m=0,a[10][10]={};
};
maritx operator*(const maritx &a,const maritx &b){
	maritx c;
	c.n=a.n;
	c.m=b.n;
	for (int i=1;i<=c.n;i++){
		for (int j=1;j<=c.m;j++){
			for (int k=1;k<=a.m;k++){
				c.a[i][j]=(c.a[i][j]+1ll*a.a[i][k]*b.a[k][j])%mo;
			}
		}
	}
	return c;
}
maritx f(maritx x,int y){
	if (y==0){
		maritx z;
		z.m=z.n=x.n;
		for (int i=1;i<=z.n;i++){
			for (int j=1;j<=z.m;j++){
				if (i==j) z.a[i][j]=1;
			}
		}
		return z;
	}
	maritx v=f(x,(y>>1));
	v=v*v;
	if (y&1==1){
		v=v*x;
	}
	return v;
}
maritx a,b;
int n,k;
int main(){
	n=read();
	a.a[1][1]=1;
	a.a[1][2]=0;
	a.n=1;
	a.m=2;
	b.a[1][1]=1;
	b.a[1][2]=1;
	b.a[2][1]=1;
	b.a[2][2]=0;
	b.n=2;
	b.m=2;
	a=a*f(b,n-1);
	printf("%d",a.a[1][1]);
	return 0;
} 
2022/10/4 22:43
加载中...