#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; } pair solve1(const vector& a, long long k) { int n = a.size(); queue q; int sum = 0; for(int i=0; i ans(-1, sum); for(int i=n; i solve2(const vector& a, long long k) { int n = a.size(); vector > mat(n+1, vector(n+1, 0)); for(int i=0; i ans(0, 0); for(int i=0; i> n >> k; vector a(n); for(int i=0; i> a[i]; pair ans; if(n > 30) ans = solve1(a, k); else ans = solve2(a, k); cout << ans.first << ' ' << ans.second << endl; return 0; }