#ifndef _GLIBCXX_NO_ASSERT #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#ifdef __GXX_EXPERIMENTAL_CXX0X__ #include #include #include #include #include #include #include #include //#endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include //#include #include //#include #include //#include #include #include #include #include //#include #include #include #include #include #include using namespace std; typedef long long ll; typedef vectorvec; typedef vectormat; // A*Bの計算 mat mul ( mat &A , mat&B , ll M ) { mat C ( A.size () , vec ( B[0].size () ) ); for( int i = 0; i < A.size (); i++ ) { for( int k = 0; k < B.size (); k++ ) { for( int j = 0; j < B[0].size (); j++ ) { C[i][j] = ( C[i][j] + A[i][k] * B[k][j] ) % M; } } } return C; } // A^nの計算 mat pow ( mat A , ll n , ll M ) { mat B ( A.size () , vec ( A.size () ) ); for( int i = 0; i < A.size (); i++ ) { B[i][i] = 1; } while( n > 0 ) { if( n & 1 ) B = mul ( B , A , M ); A = mul ( A , A , M ); n >>= 1; } return B; } //初期化 //mat A(2, vec(2)); int main () { long long int N , K; cin >> N >> K; mat A ( N + 1 , vec ( N + 1 ) ); for( size_t i = 0; i < N - 1; i++ ) { A[i][i + 1] = 1; } for( int i = 0; i < N; i++ ) { A[N - 1][N - i - 1] = 1; A[N][i] = 1; } A[N][N] = 1; mat B ( N + 1 , vec ( 1 ) ); for( size_t i = 0; i < N; i++ ) { cin >> B[i][0]; } for( size_t i = 0; i < N; i++ ) { B[N][0] += B[i][0]; } mat D = pow ( A , K - N , ( long long int )1e9 + 7 ); mat C = mul ( D , B , ( long long int )1e9 + 7 ); cout << C[N - 1][0] << " " << C[N][0] << endl; return 0; }