Students will master the theoretical material provided by the course, be able to apply the knowledge gained to solving theoretical and applied problems. The material covered by the course includes: sorting algorithms, algorithms on graphs, greedy algorithms and dynamic programming, data structures, generating functions, matroids, error-correcting code, algebraic and probabilistic methods, theory of formal languages, computability and expressibility, information theory, complexity classes and hierarchies, interactive proof systems, circuit complexity, probabilistically checkable proofs.