调了俩小时,一直输出0
无语了,感谢帮助~
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1e2;
const int mod = 1000000007;
int T;
struct mat {
long long m, n, number[MAXN][MAXN];
mat () {
m = 0; n = 0;
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= n; ++j)
number[i][j] = 0;
}
mat operator * (mat B) {
mat answer;
answer.m = m; answer.n = B.n;
for (int i = 1; i <= answer.m; ++i) {
for (int j = 1; j <= answer.n; ++j) {
for (int k = 1; k <= n; ++k) {
answer.number[i][j] += number[i][k] % mod * B.number[k][j] % mod;
answer.number[i][j] %= mod;
}
}
}
return answer;
}
};
mat fastpow (mat A, long long k) {
mat answer;
mat base = A;
for (int i = 1; i <= answer.m; ++i)
answer.number[i][i] = 1;
while (k) {
if (k & 1) answer = answer * base;
base = base * base;
k /= 2;
}
return answer;
}
int main () {
mat T1, T2;
T1.m = T1.n = 3;
T1.number[1][1] = 1; T1.number[1][3] = 1;
T1.number[2][1] = 1;
T1.number[3][2] = 1;
T2.m = 3; T2.n = 1;
T2.number[1][1] = 1;
T2.number[2][1] = 1;
T2.number[3][1] = 1;
cin >> T;
for (int i = 1; i <= T; ++i) {
int num; cin >> num;
if (num <= 3) {
cout << 1 << endl;
continue;
}
mat answer;
answer.m = 3; answer.n = 1;
answer = fastpow (T1, num - 3) * T2;
cout << answer.number[1][1] << endl;
}
return 0;
}