请大家帮我看看这个代码为什么溢出输出负数了
查看原帖
请大家帮我看看这个代码为什么溢出输出负数了
300078
pengyule楼主2021/2/2 22:11

如题,谢谢。

#include <bits/stdc++.h>
#define int long long
const int Mod=1e9+7;
using namespace std;
void mul(long long a[4],long long b[4][4]){
    long long c[4]; memset(c,0ll,sizeof(c));
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            c[i]=(c[i]+a[j]*b[j][i]%Mod)%Mod;
    memcpy(a,c,sizeof(c));
}
void mulself(long long a[4][4]){
    long long c[4][4]; memset(c,0ll,sizeof(c));
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            for(int k=0;k<4;k++)
                c[i][j]=(c[i][j]+a[i][k]*a[k][j]%Mod)%Mod;
    memcpy(a,c,sizeof(c));
}
void PowerMod(long long b){
    long long ans[4]={0,1,0,1};
    long long a[4][4]={{0,1,0,1},{1,1,0,1},{0,0,0,1},{0,0,1,1}};
    while(b){
        if(b%2ll) mul(ans,a);
        b/=2ll,mulself(a);
    }
    long long Ans=(2ll*((ans[3]-(ans[0]+ans[1]*2ll%Mod)%Mod+1ll)%Mod))%Mod;
	cout<<Ans<<endl;
}
void solve()
{
	int n;
	cin>>n;
	if(n<3){
		cout<<0<<endl; return;
	}
    ans=(ans+fib(i)*fib(n-i+1))%Mod; cout<<(ans-fib(n+2)+1)*2%Mod<<endl;
	PowerMod(n-1);
}
signed main(){
	int T; cin>>T;
	while(T--) solve();
	return 0;
}
2021/2/2 22:11
加载中...