#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const long long modc = 1e9+7; template struct Kitamasa{ vector a; //initial values (a_0, ..., a_K-1) vector c; //coefficients (c_0, ..., c_K-1) int K; //size Kitamasa(vector & _a, vector& _c) : a(_a), c(_c), K((int) _a.size()){ for (int i=0; i dfs(long long N){ assert(N >= K); if (N == K) return c; vector res(K); if (N & 1 || N < K*2){ vector x = dfs(N-1); for (int i=0; i> x(K, vector(K)); x[0] = dfs(N>>1); for (int i=1; i x = dfs(N); T res = 0; for (int i=0; i 0){ if ((e & 1LL)) ans = (ans * b) % modc; e = e >> 1LL; b = (b*b) % modc; } return ans; } long long div(string &D){ long long res = 0; for (int i=0; i a = {1, 2}, c = {1, 1}; Kitamasa K(a, c); cin >> N; for (int i=0; i> C >> D; ans *= mod_exp(K.calc(C), div(D)); ans %= modc; } cout << ans << endl; return 0; }