#include #include #include #include #include using namespace std; using i32 = int; using u32 = unsigned int; using i64 = long long; using u64 = unsigned long long; #define rep(i,n) for(int i=0; i<(int)(n); i++) const i64 INF = 1001001001001001001; using Modint = atcoder::static_modint<1000000007>; int main(){ int N, K; cin >> K >> N; Modint n = N; vector dp(7, n); // 0 x x x // 1 x x 0 // 2 x 0 0 // 3 x 0 1 // 4 0 0 0 // 5 0 0 1 // 6 0 1 2 dp[1] -= 1; dp[2] -= 1; dp[3] -= 2; dp[4] -= 1; dp[5] -= 2; dp[6] -= 3; for(int k=1; k<=K; k++){ vector tmp(7); tmp[0] = dp[1] * dp[1] * dp[1] * n; tmp[1] = dp[1] * dp[3] * dp[3] * (n-1) + dp[1] * dp[2] * dp[2]; tmp[2] = dp[3] * dp[3] * dp[5] * (n-1) + dp[2] * dp[2] * dp[4]; tmp[3] = dp[3] * dp[3] * dp[6] * (n-2) + dp[2] * dp[3] * dp[5] * 2; tmp[4] = dp[5] * dp[5] * dp[5] * (n-1) + dp[4] * dp[4] * dp[4]; tmp[5] = dp[5] * dp[6] * dp[6] * (n-2) + dp[4] * dp[5] * dp[5] + dp[5] * dp[5] * dp[5]; tmp[6] = dp[6] * dp[6] * dp[6] * (n-3) + dp[6] * dp[5] * dp[5] * 3; swap(dp, tmp); } cout << dp[0].val() << endl; return 0; }