#ifndef LOCAL #include using namespace std; #define debug(...) (void(0)) #else #include "algo/debug.h" #endif #include using mint = atcoder::modint1000000007; void solve() { int M, K; cin >> M >> K; vector dp(M, vector(M)); for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { dp[(i + j) % M][i] += 1; dp[(i * j) % M][i] += 1; } } vector ans(M, vector(M)); for (int i = 0; i < M; i++) ans[i][i] = 1; using dat = vector>; const auto op = [&](const dat& a, const dat& b) -> dat { dat res(M, vector(M)); for (int i = 0; i < M; i++) { for (int k = 0; k < M; k++) { for (int j = 0; j < M; j++) { res[i][j] += a[i][k] * b[k][j]; } } } return res; }; while (K) { if (K & 1) { ans = op(ans, dp); } dp = op(dp, dp); K >>= 1; } cout << ans[0][0].val() << endl; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int tt = 1; // std::cin >> tt; while (tt--) { solve(); } }