public static void Solve() { var(N, K) = Scanner.Scan <int, int>(); var G = new int[N][]; for (var i = 0; i < N; i++) { G[i] = Scanner.ScanEnumerable <int>().ToArray(); } mint answer = 1; var dsu1 = new DisjointSetUnion(N); var dsu2 = new DisjointSetUnion(N); for (var i = 0; i < N; i++) { for (var j = i + 1; j < N; j++) { var(ok1, ok2) = (true, true); for (var k = 0; k < N; k++) { ok1 &= G[k][i] + G[k][j] <= K; ok2 &= G[i][k] + G[j][k] <= K; } if (ok1) { dsu1.Merge(i, j); } if (ok2) { dsu2.Merge(i, j); } } } foreach (var group in dsu1.GetGroups()) { answer *= EnumerationModulo.Factorial(group.Count()); } foreach (var group in dsu2.GetGroups()) { answer *= EnumerationModulo.Factorial(group.Count()); } Console.WriteLine(answer); }
public static void Solve() { var(N, M) = Scanner.Scan <int, int>(); if (M == 1) { Console.WriteLine(1); return; } mint answer = 1; foreach (var v in Prime.GetFactors(M).Values) { answer *= EnumerationModulo.Combination(v + N - 1, N - 1); } Console.WriteLine(answer); }