显然WA飞但是过了
查看原帖
显然WA飞但是过了
1060705
Draw_Cloud楼主2024/3/27 20:44

rt,不知道为什么

矩阵居然满足了交换律(好吧,应该是某些奇妙错误)
#include<bits/stdc++.h>
#define ll long long
#define il inline
#define N 3
using namespace std;
il ll read(){ll x=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-'){w=-1;}ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*w;}
ll k,m=1e9+7,T;
struct Mat{
	ll a[N][N];
	Mat(){memset(a,0,sizeof(a));}
	inline void build(){
		for(int i=0;i<N;++i)a[i][i]=1;
	}
	Mat operator*(const Mat&x){
        Mat ans;
        for(int i=0;i<N;++i){for(int j=0;j<N;++j){for(int k=0;k<N;++k){
                ans.a[i][j]+=(a[i][k]*x.a[k][j])%m;
            }
            ans.a[i][j]=(((ans.a[i][j]%m)+m)%m);
        }}
        return ans;
    }
};
Mat a,c;
il Mat qpow(Mat b,ll c) {
    Mat ans;
    ans.a[0][0]=1;ans.a[0][1]=0;ans.a[0][2]=0;
	ans.a[1][0]=0;ans.a[1][1]=1;ans.a[1][2]=0;
	ans.a[2][0]=0;ans.a[2][1]=0;ans.a[2][2]=1;//这里  
    for(;c;c>>=1,b=b*b)if(c&1){ans=ans*b;}//这里  
    return ans;
}
int main(){
	T=read();
	c.a[0][0]=1;c.a[0][1]=0;c.a[0][2]=1;
	c.a[1][0]=1;c.a[1][1]=0;c.a[1][2]=0;
	c.a[2][0]=0;c.a[2][1]=1;c.a[2][2]=0;//这里  
	for(int i=0;i<T;i++){
		a=qpow(c,read()-1);//还有这里,都是错的  
		printf("%lld\n",a.a[0][0]);
//		for(int i=0;i<N;++i){for(int j=0;j<N;++j){
//		printf("%lld ",a.a[i][j]);
//		}printf("\n");}
	}
	return 0;
}
2024/3/27 20:44
加载中...