#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int MOD = 1000000007; // 行列の積 template vector > matrixProduct(const vector >& x, const vector >& y) { int a = x.size(); int b = x[0].size(); int c = y[0].size(); vector > z(a, vector(c, 0)); for(int i=0; i vector > matrixPower(const vector >& x, long long k) { int n = x.size(); vector > y(n, vector(n, 0)); for(int i=0; i > z = x; while(k > 0){ if(k & 1) y = matrixProduct(y, z); z = matrixProduct(z, z); k >>= 1; } return y; } void solve(const vector& dice, int n, vector& ans) { int m = *max_element(dice.begin(), dice.end()) * n; vector > dp(n+1, vector(m+1, 0)); dp[0][0] = 1; for(int a : dice){ for(int i=0; i dice1 = {2, 3, 5, 7, 11, 13}; const vector dice2 = {4, 6, 8, 9, 10, 12}; long long n; int p, c; cin >> n >> p >> c; vector a, b; solve(dice1, p, a); solve(dice2, c, b); int m = a.size() + b.size() - 1; vector x(m, 0); for(unsigned i=0; i > mat(m, vector(m, 0)); for(int i=0; i