LeetCode in Kotlin

2550. Count Collisions of Monkeys on a Polygon

Medium

There is a regular convex polygon with n vertices. The vertices are labeled from 0 to n - 1 in a clockwise direction, and each vertex has exactly one monkey. The following figure shows a convex polygon of 6 vertices.

Each monkey moves simultaneously to a neighboring vertex. A neighboring vertex for a vertex i can be:

A collision happens if at least two monkeys reside on the same vertex after the movement or intersect on an edge.

Return the number of ways the monkeys can move so that at least one collision happens. Since the answer may be very large, return it modulo 109 + 7.

Note that each monkey can only move once.

Example 1:

Input: n = 3

Output: 6

Explanation: There are 8 total possible movements.

Two ways such that they collide at some point are:

Example 2:

Input: n = 4

Output: 14

Explanation: It can be shown that there are 14 ways for the monkeys to collide.

Constraints:

Solution

class Solution {
    fun monkeyMove(n: Int): Int {
        return (((modPow2(n - 2) - 1 shl 2) + 2) % 1000000007).toInt()
    }

    private fun modPow2(n: Int): Long {
        if (n == 0) return 1
        val b = modPow2(n shr 1)
        return (b * b shl (n and 1)) % 1000000007
    }
}