求调神秘错误
查看原帖
求调神秘错误
1420422
Lyzc0dr楼主2025/7/19 21:45

WA,帮条的dalao可不可以把改好的代码交以下再回复

#include <bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
struct M {
    int n, m;
    int mat[107][107];
    M() {
        memset(mat, 0, sizeof(mat));
    }
} bas, ori;
const int MOD = 1e9 + 7;
const int N=1e7+10;
int n, T, f[N];
M mul(M a, M b) {
    M ans;
    ans.n = a.n, ans.m = b.m;
    for (int i = 1; i <= ans.n; i++) {
        for (int j = 1; j <= ans.m; j++) {
            for (int k = 1; k <= a.m; k++) {
                ans.mat[i][j] = (ans.mat[i][j] + 1ll * a.mat[i][k] * b.mat[k][j]) % (MOD - 1);
            }
        }
    }
    return ans;
}
M qpow(M x, ll p) {
    M ret;
    ret.n = ret.m = x.n;
    for (int i = 1; i <= x.n; i++) ret.mat[i][i] = 1;
    while (p) {
        if (p & 1) ret = mul(ret, x);
        p >>= 1;
        x = mul(x, x);
    }
    return ret;
}
int qpow_num(int a, int b) {
    int ret = 1;
    a %= MOD;
    while (b) {
        if (b & 1) ret = 1ll * ret * a % MOD;
        b >>= 1;
        a = 1ll * a * a % MOD;
    }
    return ret;
}
void low_fib() {
    f[0] = f[1] = 1;
    for (int i = 2;f[i]<MOD;i++) {
        f[i] = f[i - 1] + f[i - 2];
    }
}
int get_a(int n){
	int res=n;
	for(int i=1;f[i]<MOD;i++){
		if(res>=f[i])res++;
		else break;
	}
	return res;
}
void init(){
	bas.n=bas.m=2;
	ori.n=1,ori.m=2;
	bas.mat[1][1]=bas.mat[1][2]=bas.mat[2][1]=1;
	ori.mat[1][1]=ori.mat[1][2]=1;
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    low_fib();
    cin >> T;
    while (T--) {
    	init();
        cin >> n;
        int a=get_a(n);
        if(n>=2){
        	M ans=qpow(bas,n-1);
        	ans=mul(ori,ans);
        	int b=ans.mat[1][1];
        	cout<<qpow_num(a,b)%MOD<<"\n";
		}else{
			cout<<qpow_num(a,1)<<"\n";
		}
    }
    return 0;
}
2025/7/19 21:45
加载中...