long long F[120]; // memorization мемоизация map< pair< long long, int >, long long > Map; long long dfs( long long n, int i ) { if (n==1) return 1; auto pp = make_pair( n, i ); if (Map.find(pp) != Map.end()) return Map[pp]; long long res = 0; for (int a=3; a<=i; a++) if (n % F[a] == 0) res += dfs( n/F[a], a ); Map[pp] = res; return res; } F[1]=F[2]=1; for (int i=3; i<=100; i++) F[i] = F[i-1]+F[i-2]; https://codeforces.com/gym/104156 https://neerc.ifmo.ru/school/archive/2022-2023/ru-olymp-regional-2023-solutions.pdf https://contest.yandex.ru/roiarchive/ https://e-maxx.ru/algo/bridge_searching https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BD%D0%B3%D1%80%D1%83%D1%8D%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4 https://e-maxx.ru/algo/kuhn_matching int M[n][n]; bool F[n]; int flow( int v, int mn, int sc ) { if (v==T) return mn; F[v] = true; for (int u=0; u=sc) { int tmp = flow( u, min(mn, M[v][u]) ); if (tmp>0) { M[v][u] -= tmp; M[u][v] += tmp; return tmp; } } return 0; } int max_flow = 0; while(true) { memset( F, 0, sizeof(F) ); int cur_flow = flow( S, INF ); if (cur_flow==0) break; max_flow += cur_flow; }