public void Solve() { Modular ans = 1; Modular factN = Modular.Fac((int)N); // iは結果に含まれる0の数 for (int i = 1; i <= N - 1; i++) { // Kが足りないので0を作れない if (i > K) { break; } // Kの偶奇を考慮しない部屋の分割方法 Modular b = Modular.Ncr((int)N - 1, (int)N - i - 1); // Console.WriteLine(); // Console.WriteLine(i); // Console.WriteLine((int) b); // Console.WriteLine((int)(factN / Modular.Fac(i) / Modular.Fac((int) N - i))); // 0と0でない数字の並びを考える ans = ans + b * (factN / Modular.Fac(i) / Modular.Fac((int)N - i)); // Console.WriteLine((int)ans); } Console.WriteLine((int)ans); }
public static Modular Pow(Modular a, int n) { switch (n) { case 0: return(1); case 1: return(a); default: var p = Pow(a, n / 2); return(p * p * Pow(a, n % 2)); } }