/*Dãy số Fibonacci được định nghĩa Fn = Fn-1 + Fn-2, n>1 và F0 = 0, F1 = 1. Dưới đây là một số số Fibonacci : 0, 1, 1, 2, 3, 5, 8, 13, 21…
Nhiệm vụ của bạn là tìm số Fibonacci thứ n.
Input:
Dòng đầu tiên đưa vào số lượng bộ test T.
Những dòng kế tiếp đưa vào các bộ test. Mỗi bộ test là một số nguyên dương n.
T, n thỏa mãn ràng buộc :1 ≤ T ≤ 100; 1≤n≤1000.
Output:
Đưa ra kết quả mỗi test theo modulo 109 + 7 theo từng dòng.*/
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int mod = 1e9 + 7;
struct matran{
ll a[2][2];
friend matran operator * (matran x, matran y){
matran res;
for(int i = 0; i < 2; i++){
for(int j = 0; j < 2; j++){
res.a[i][j] = 0;
for(int k = 0; k < 2; k++){
res.a[i][j] += x.a[i][k] * y.a[k][j];
res.a[i][j] %= mod;
}
}
}
return res;
}
};
matran binpow(matran a, ll k){
if(k == 1) return a;
matran X = binpow(a, k / 2);
if(k % 2 == 0){
return X * X;
}
else return X * X * a;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t; cin >> t;
while(t--){
int n; cin >> n;
matran x;
x.a[0][0] = 1;
x.a[0][1] = 1;
x.a[1][0] = 1;
x.a[1][1] = 0;
matran res = binpow(x, n);
cout << res.a[0][1] << endl;
}
return 0;
}
LypEw6N5IHPhu5EgRmlib25hY2NpIMSRxrDhu6NjIMSR4buLbmggbmdoxKlhIEZuID0gRm4tMSArIEZuLTIsIG4+MSB2w6AgRjAgPSAwLCBGMSA9IDEuIETGsOG7m2kgxJHDonkgbMOgIG3hu5l0IHPhu5Egc+G7kSBGaWJvbmFjY2kgOiAwLCAxLCAxLCAyLCAzLCA1LCA4LCAxMywgMjHigKYKCk5oaeG7h20gduG7pSBj4bunYSBi4bqhbiBsw6AgdMOsbSBz4buRIEZpYm9uYWNjaSB0aOG7qSBuLgoKSW5wdXQ6CgpEw7JuZyDEkeG6p3UgdGnDqm4gxJHGsGEgdsOgbyBz4buRIGzGsOG7o25nIGLhu5kgdGVzdCBULgpOaOG7r25nIGTDsm5nIGvhur8gdGnhur9wIMSRxrBhIHbDoG8gY8OhYyBi4buZIHRlc3QuIE3hu5dpIGLhu5kgdGVzdCBsw6AgbeG7mXQgc+G7kSBuZ3V5w6puIGTGsMahbmcgbi4KVCwgbiB0aOG7j2EgbcOjbiByw6BuZyBideG7mWMgOjEg4omkIFQg4omkIDEwMDsgMeKJpG7iiaQxMDAwLgpPdXRwdXQ6CgrEkMawYSByYSBr4bq/dCBxdeG6oyBt4buXaSB0ZXN0IHRoZW8gbW9kdWxvIDEwOSArIDcgdGhlbyB04burbmcgZMOybmcuKi8KCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgbGwgbG9uZyBsb25nCgppbnQgbW9kID0gMWU5ICsgNzsKCnN0cnVjdCBtYXRyYW57CglsbCBhWzJdWzJdOwoJZnJpZW5kIG1hdHJhbiBvcGVyYXRvciAqIChtYXRyYW4geCwgbWF0cmFuIHkpewoJCW1hdHJhbiByZXM7CgkJZm9yKGludCBpID0gMDsgaSA8IDI7IGkrKyl7CgkJCWZvcihpbnQgaiA9IDA7IGogPCAyOyBqKyspewoJCQkJcmVzLmFbaV1bal0gPSAwOwoJCQkJZm9yKGludCBrID0gMDsgayA8IDI7IGsrKyl7CgkJCQkJcmVzLmFbaV1bal0gKz0geC5hW2ldW2tdICogeS5hW2tdW2pdOwoJCQkJCXJlcy5hW2ldW2pdICU9IG1vZDsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gcmVzOwoJfQp9OwoKbWF0cmFuIGJpbnBvdyhtYXRyYW4gYSwgbGwgayl7CglpZihrID09IDEpIHJldHVybiBhOwoJbWF0cmFuIFggPSBiaW5wb3coYSwgayAvIDIpOwoJaWYoayAlIDIgPT0gMCl7CgkJcmV0dXJuIFggKiBYOwoJfQoJZWxzZSByZXR1cm4gWCAqIFggKiBhOwp9CgppbnQgbWFpbigpewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJY2luLnRpZShudWxscHRyKTsKCWludCB0OyBjaW4gPj4gdDsKCXdoaWxlKHQtLSl7CgkJaW50IG47IGNpbiA+PiBuOwoJCW1hdHJhbiB4OwoJCXguYVswXVswXSA9IDE7CgkJeC5hWzBdWzFdID0gMTsKCQl4LmFbMV1bMF0gPSAxOwoJCXguYVsxXVsxXSA9IDA7CgkJbWF0cmFuIHJlcyA9IGJpbnBvdyh4LCBuKTsKCQljb3V0IDw8IHJlcy5hWzBdWzFdIDw8IGVuZGw7Cgl9CglyZXR1cm4gMDsKfQ==