https://codeforces.com/blog/entry/98376 - https://codeforces.com/gym/361606/submission/238849350 - https://yukicoder.me/problems/no/2589