#include #include #include using namespace std; using namespace atcoder; #define rep(i, l, n) for (int i = (l); i < (n); i++) #define ite(i, a) for(auto& i : a) #define all(x) x.begin(), x.end() #define lb lower_bound #define ub upper_bound #define lbi(A, x) (ll)(lb(all(A), x) - A.begin()) #define ubi(A, x) (ll)(ub(all(A), x) - A.begin()) using ll = long long; using Pair = pair; template using V = vector; template using VV = V >; const ll INF = 1000000000000000001; const int inf = 1001001001; const ll mod = 1000000007; const ll MOD = 998244353; template inline V getList(int n) { V res(n); rep(i, 0, n) { cin >> res[i]; }return res; } template inline VV getGrid(int m, int n) { VV res(m, V(n)); rep(i, 0, m) { res[i] = getList(n); }return res; } inline V dtois(string& s) { V vec = {}; for (auto& e : s) { vec.push_back(e - '0'); } return vec; } VV prod_mat(VV& A, VV& B) { VV res = { {0,0},{0,0} }; rep(i, 0, 2) { rep(j, 0, 2) { rep(k, 0, 2) { res[i][j] += A[i][k] * B[k][j] % mod; res[i][j] %= mod; } } } return res; } VV exp_mat(VV A, ll n) { VV res = { {1,0},{0,1} }; while (n) { if (n & 1) { res = prod_mat(A, res); } A = prod_mat(A, A); n >>= 1; } return res; } int main(void) { ll a, b; cin >> a >> b; int n; cin >> n; rep(i, 0, n) { ll t; cin >> t; ll s = t >> 1; VV A = { {a,b},{1,0} }; VV P = exp_mat(A, s); V v = { (P[0][0] + P[0][1]) % mod,(P[1][0] + P[1][1]) % mod }; if (t & 1) { cout << ((v[0] + v[1] + a * v[0] % mod + b * v[1] % mod) % mod) << endl; } else { cout << ((v[0] + v[1]) % mod) << endl; } } return 0; }