public void Solve() { var n = sc.Integer(); var s = sc.Scan(); var dp = new ModInteger[n + 1]; var next = new ModInteger[n + 1]; dp[0] = 1; for (int _ = 0; _ < n; _++) { for (int i = 0; i < n; i++) { next[i + 1] += dp[i]; next[i + 1] += dp[i]; next[Math.Max(0, i - 1)] += dp[i]; } for (int i = 0; i <= n; i++) { dp[i] = next[i]; next[i] = 0; } } var res = dp[s.Length]; var k = ModInteger.Pow(2, s.Length); res *= ModInteger.Pow(k, ModInteger.Mod - 2); IO.Printer.Out.WriteLine(res); }
public void Solve() { var n = sc.Integer(); var s = sc.Scan(); //const int MOD = (int)ModInteger.Mod; var dp = new ModInteger[n + 1]; dp[0] = 1; for (int _ = 0; _ < n; _++) { var next = new ModInteger[n + 1]; for (int i = 0; i < n; i++) { next[i + 1] += dp[i]; //if (next[i + 1] >= MOD) next[i + 1] -= MOD; next[i + 1] += dp[i]; //if (next[i + 1] >= MOD) next[i + 1] -= MOD; var p = Math.Max(0, i - 1); next[p] += dp[i]; //if (next[p] >= MOD) next[p] -= MOD; } dp = next; } ModInteger res = dp[s.Length]; var k = ModInteger.Pow(2, s.Length); res *= ModInteger.Pow(k, ModInteger.Mod - 2); IO.Printer.Out.WriteLine(res); }
public void Solve() { var a = sc.Long(); var b = sc.Long(); ModInteger.Mod = sc.Integer(); var mat = new ModMatrix(2, 2); mat[0, 0] = 10; mat[0, 1] = 1; mat[1, 1] = 1; var vec = new ModMatrix(2, 1); vec[0, 0] = 1; vec[0, 1] = 1; var gcd = MathEx.GCD(a, b); var A = (ModMatrix.Pow(mat, a - 1) * vec)[0, 0]; mat[0, 0] = ModInteger.Pow(10, gcd); var B = (ModMatrix.Pow(mat, b / gcd - 1) * vec)[0, 0]; IO.Printer.Out.WriteLine(A * B); //IO.Printer.Out.WriteLine(A * B * ModInteger.Inverse(GCD)); }
public void Solve() { var n = sc.Integer(); var A = sc.Long(); var B = sc.Long(); var a = new BigInteger[n]; for (int i = 0; i < n; i++) { a[i] = sc.Long(); } Array.Sort(a); if (A == 1) { for (int i = 0; i < n; i++) { IO.Printer.Out.WriteLine(a[i]); } return; } while (B > 0) { if (a[n - 1] < a[0] * A) { break; } a[0] *= A; Array.Sort(a); Debug.WriteLine(a.AsJoinedString()); B--; } Debug.WriteLine(B); var k = B / n; var rem = B % n; while (rem > 0) { a[0] *= A; Array.Sort(a); rem--; } for (int i = 0; i < n; i++) { var v = a[i] % 1000000007; v = (v * ModInteger.Pow(A, k).num) % 1000000007; IO.Printer.Out.WriteLine(v); } }
public void Solve() { var n = sc.Integer(); var s = sc.Scan(); const long MOD = ModInteger.Mod; var dp = new long[n + 1]; var next = new long[n + 1]; dp[0] = 1; for (int _ = 0; _ < n; _++) { for (int i = 0; i < n; i++) { next[i + 1] += dp[i]; if (next[i + 1] >= MOD) { next[i + 1] -= MOD; } next[i + 1] += dp[i]; if (next[i + 1] >= MOD) { next[i + 1] -= MOD; } var p = Math.Max(0, i - 1); next[p] += dp[i]; if (next[p] >= MOD) { next[p] -= MOD; } } for (int i = 0; i <= n; i++) { dp[i] = next[i]; next[i] = 0; } } ModInteger res = dp[s.Length]; var k = ModInteger.Pow(2, s.Length); res *= ModInteger.Pow(k, ModInteger.Mod - 2); IO.Printer.Out.WriteLine(res); }
public void Solve() { var n = sc.Integer(); var m = sc.Integer(); var k = sc.Integer(); var table = new ModTable(n + m + k + 1); ModInteger ans = 0; ModInteger C = 1; var l = 0; var r = 0; for (int i = n; i <= n + m + k; i++) { var a = table.Combination(i - 1, n - 1); a *= ModInteger.Pow(3, n + m + k - i); a *= C; ans += a; C *= 2; var rem = i - n + 1; Debug.WriteLine("{0} {1}", l, r); var nl = Math.Max(0, rem - k); var nr = Math.Min(m, rem); if (l != nl) { C -= table.Combination(i - n, l); } if (r == nr) { C -= table.Combination(i - n, r); } else if (r > nr) { C -= table.Combination(i - n, r) * 2; } l = nl; r = nr; } IO.Printer.Out.WriteLine(ans); }
public void Solve() { var n = sc.Integer(); var k = sc.Integer(); ModInteger ans = 0; var div = MathEx.GetDivisors(n); var dp = new ModInteger[div.Count]; for (int i = 0; i < div.Count; i++) { if (n % 2 == 0) { dp[i] += ModInteger.Pow(k, div[i]); } else { dp[i] += ModInteger.Pow(k, div[i] / 2 + 1); } for (int j = 0; j < i; j++) { if (div[i] % div[j] == 0) { dp[i] -= dp[j]; } } if (n % 2 == 0 && (n / div[i]) % 2 == 0) { ans += dp[i] * div[i]; } if (n % 2 == 1) { ans += dp[i] * div[i]; } } Debug.WriteLine(dp.AsJoinedString()); //naive(n, k); IO.Printer.Out.WriteLine(ans); }
public void Solve() { var n = sc.Integer(); var l = sc.Long(n).Distinct().ToArray(); Array.Sort(l); var ans = ModInteger.Pow(2, l[0]); var gcd = 0L; foreach (var x in l.Skip(1).Select(x => x - l[0])) { if (gcd == 0) { gcd = x; } else { gcd = MathEx.GCD(gcd, x); } } ans *= ModInteger.Pow(2, (gcd + 1) / 2); IO.Printer.Out.WriteLine(ans); }
public static ModInteger operator ^(ModInteger l, long r) { return(ModInteger.Pow(l, r)); }