Pre-requisite: Knowledge and understanding of basic constructs of a programming language

### Mathematics

- Basic Number theory
- Motivation and concept of modulo(mod)
- Addition, subtraction and multiplication under modulo
- Prime numbers(Some important properties)
- Euclidâ€™s GCD algorithm
- Appendix: Division under modulo:

- Sets
- Venn diagrams
- Set builder notations
- subsets
- Union, intersections, difference, membership
- Set equality
- Empty, Universal sets
- Types of numbers and their symbols

- Relations and Functions
- Relations: Intuitive idea - member of set A is related to member of set B
- Relations: Bigger picture - subsets of cartesian products
- Concept of domain, co-domain of a relation
- Direction in a relation
- No pre-image can have more than one image
- Concept of functions
- Concept of domain, range of a function
- Functions: Dependent and Independent variables

- Intro to combinatorics
- Principle of counting
- Selection
- Permutation
- Factorials
- Combinations

- Logarithms
- Idea of what is exactly logarithm of a number.
- Properties.
- Examples

- Complexity Analysis
- Notions of efficiency
- How to measure efficiency - express runtime as a function of input size
- Examples of measuring efficiency of some problems
- Comparison of functions
- Big-O notation

### Language Constructs - C++ - 1

- Introduction to C++
- What is C++?
- Why do we need another language?
- Basic Structure of a C++ program

- Data types
- Recap of data types in Python
- Declaring and initializing variables of different data types in C++.
- Primitives datatypes in C++
- int
- long long
- float
- double
- char
- Bool

- Overflow of values
- Arrays
- Motivation
- Arrays in C++ including implementation
- Difference between python lists and C++ array

- Control flow
- Decision Making statements
- and, or, not operators
- Loops

- I / O
- Introduction(Motivation)
- Concept of Streams
- Input using cin
- Input using getline
- Output using cout

- Functions
- Recursion
- Notion of Structs
- Basic Idea of an user defined data type.
- Motivational Problem
- Implementation in C++

### Algorithms and data structures - 1

- Searching
- Motivational Problem
- Linear Search
- Binary Search
- Algorithm
- Complexity
- Code

- Think about implementing your own lower_bound().

- Sorting
- Insertion sort
- Algorithm
- Visualization
- Code
- Complexity Analysis

- Merge sort
- Merging two small sorted arrays to get another sorted array(Algorithm).
- The idea of Divide and Conquer
- Algorithm
- Visualization
- Code
- Complexity Analysis

### Language Constructs - C++ 2

- STL - Containers(stack + queue + priority queue)
- Stack(Motivational Problem, some important functions, LIFO)
- Queues(Motivational Problem, some important functions, FIFO)
- Priority Queues(Motivational Problem, some important functions)

- STL - Containers(string + vector + pair)
- Strings(Basic idea, some important functions)
- Vector(Basic idea, some important functions)
- Pair(Basic idea, some important functions)
- Appendix: Iterators

- STL - Algorithms + Set + Map
- sort
- upper_bound
- lower_bound
- set(Basic idea, some important functions of set container)
- map(Basic idea, some important functions of map container)

- Structs - Using them as comparators
- Basic Idea of comparators
- Implementation in C++.

### Algorithms and data structures - 2

- Dynamic Programming(DP)
- Concept of Subproblem of a problem and overlapping subproblems.
- DP as Recursion+Memoization
- Linear DPs
- Multi-dimensional DP

- Graphs and Graph Algorithms
- Modelling problems as graphs
- Types of Graphs
- Undirected Graphs
- Directed Graphs

- Representation of graphs
- Adjacency Matrix
- Adjacency list

- Depth First Search(Algorithm, Code, Visualization)
- Breadth First Search(Algorithm, Code, Visualization)
- (Optional) Shortest Path Algorithms(Algorithms, Codes, Visualizations)

- Sieves
**Credits: **We would like to thank Swetanjal Dutta, Parth Mittal and Kushagra Arora from the community for preparing these tutorials. In case you would like to contribute in any kind of content, or can provide improvements in the existing one, you are most welcome. Feel free to get in touch with us on schools@codechef.com