結果
問題 | No.1102 Remnants |
ユーザー | takytank |
提出日時 | 2020-07-04 00:22:58 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 147 ms / 2,000 ms |
コード長 | 10,143 bytes |
コンパイル時間 | 926 ms |
コンパイル使用メモリ | 120,028 KB |
実行使用メモリ | 42,112 KB |
最終ジャッジ日時 | 2024-09-17 05:16:25 |
合計ジャッジ時間 | 3,696 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 23 ms
17,792 KB |
testcase_01 | AC | 26 ms
17,664 KB |
testcase_02 | AC | 25 ms
17,792 KB |
testcase_03 | AC | 25 ms
18,048 KB |
testcase_04 | AC | 26 ms
17,920 KB |
testcase_05 | AC | 109 ms
37,120 KB |
testcase_06 | AC | 43 ms
22,016 KB |
testcase_07 | AC | 147 ms
42,036 KB |
testcase_08 | AC | 32 ms
18,816 KB |
testcase_09 | AC | 33 ms
19,328 KB |
testcase_10 | AC | 30 ms
18,304 KB |
testcase_11 | AC | 31 ms
18,944 KB |
testcase_12 | AC | 33 ms
19,328 KB |
testcase_13 | AC | 33 ms
18,944 KB |
testcase_14 | AC | 73 ms
27,520 KB |
testcase_15 | AC | 63 ms
25,472 KB |
testcase_16 | AC | 131 ms
42,112 KB |
testcase_17 | AC | 124 ms
41,088 KB |
testcase_18 | AC | 130 ms
39,516 KB |
testcase_19 | AC | 59 ms
25,088 KB |
testcase_20 | AC | 37 ms
21,120 KB |
testcase_21 | AC | 87 ms
35,712 KB |
testcase_22 | AC | 118 ms
40,320 KB |
testcase_23 | AC | 98 ms
36,480 KB |
testcase_24 | AC | 73 ms
28,544 KB |
testcase_25 | AC | 132 ms
39,732 KB |
testcase_26 | AC | 33 ms
19,584 KB |
testcase_27 | AC | 54 ms
24,576 KB |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using System.Threading; namespace AtCoder { public class Program { static void Main() { var cin = new Scanner(); int n = cin.Int(); int k = cin.Int(); var a = cin.ArrayInt(n); ModCounting.InitializeFactorial(n + 1, true); var nck = new ModInt[n + 1]; nck[0] = 1; for (int i = 0; i < n; i++) { nck[i + 1] = nck[i] * (k + i + 1); nck[i + 1] *= ModCounting.Inverse(i + 1); } ModInt ans = 0; for (int i = 0; i < n; i++) { ans += nck[i] * nck[n - 1 - i] * a[i]; } Console.WriteLine(ans); } } public static class ModCounting { private const long p_ = ModInt.P; private static ModInt[] factorial_; private static ModInt[] inverseFactorial_; private static ModInt[] inverse_; public static void InitializeFactorial(long max, bool withInverse = false) { if (withInverse) { factorial_ = new ModInt[max + 1]; inverseFactorial_ = new ModInt[max + 1]; inverse_ = new ModInt[max + 1]; factorial_[0] = factorial_[1] = 1; inverseFactorial_[0] = inverseFactorial_[1] = 1; inverse_[1] = 1; for (int i = 2; i <= max; i++) { factorial_[i] = factorial_[i - 1] * i; inverse_[i] = p_ - inverse_[p_ % i] * (p_ / i); inverseFactorial_[i] = inverseFactorial_[i - 1] * inverse_[i]; } } else { factorial_ = new ModInt[max + 1]; inverseFactorial_ = new ModInt[max + 1]; factorial_[0] = factorial_[1] = 1; for (int i = 2; i <= max; i++) { factorial_[i] = factorial_[i - 1] * i; } inverseFactorial_[max] = new ModInt(1) / factorial_[max]; for (long i = max - 1; i >= 0; i--) { inverseFactorial_[i] = inverseFactorial_[i + 1] * (i + 1); } } } public static ModInt Factorial(long n) { if (n < 0) { return 0; } return factorial_[n]; } public static ModInt InverseFactorial(long n) { if (n < 0) { return 0; } return inverseFactorial_[n]; } public static ModInt Inverse(long n) { if (n < 0) { return 0; } return inverse_[n]; } public static ModInt Permutation(long n, long k) { if (n < k || (n < 0 || k < 0)) { return 0; } return factorial_[n] * inverseFactorial_[n - k]; } public static ModInt RepeatedPermutation(long n, long k) { long ret = 1; for (k %= p_ - 1; k > 0; k >>= 1, n = n * n % p_) { if ((k & 1) == 1) { ret = ret * n % p_; } } return ret; } public static ModInt Combination(long n, long k) { if (n < k || (n < 0 || k < 0)) { return 0; } return factorial_[n] * inverseFactorial_[k] * inverseFactorial_[n - k]; } public static ModInt CombinationK(long n, long k) { ModInt ret = 1; for (int i = 0; i < k; i++) { ret *= (n - i); ret *= inverse_[i + 1]; } return ret; } public static ModInt HomogeneousProduct(long n, long k) { if (n < 0 || k < 0) { return 0; } return Combination(n + k - 1, k); } } public struct ModInt { public const long P = 1000000007; //public const long P = 998244353; public static ModInt Inverse(ModInt value) => Pow(value, P - 2); public static ModInt Pow(ModInt value, long k) => Pow(value.value_, k); public static ModInt Pow(long value, long k) { long ret = 1; for (k %= P - 1; k > 0; k >>= 1, value = value * value % P) { if ((k & 1) == 1) { ret = ret * value % P; } } return new ModInt(ret); } private long value_; public ModInt(long value) => value_ = value; public ModInt(long value, bool mods) { if (mods) { value %= P; if (value < 0) { value += P; } } value_ = value; } public static ModInt operator +(ModInt lhs, ModInt rhs) { lhs.value_ = (lhs.value_ + rhs.value_) % P; return lhs; } public static ModInt operator +(long lhs, ModInt rhs) { rhs.value_ = (lhs + rhs.value_) % P; return rhs; } public static ModInt operator +(ModInt lhs, long rhs) { lhs.value_ = (lhs.value_ + rhs) % P; return lhs; } public static ModInt operator -(ModInt lhs, ModInt rhs) { lhs.value_ = (P + lhs.value_ - rhs.value_) % P; return lhs; } public static ModInt operator -(long lhs, ModInt rhs) { rhs.value_ = (P + lhs - rhs.value_) % P; return rhs; } public static ModInt operator -(ModInt lhs, long rhs) { lhs.value_ = (P + lhs.value_ - rhs) % P; return lhs; } public static ModInt operator *(ModInt lhs, ModInt rhs) { lhs.value_ = lhs.value_ * rhs.value_ % P; return lhs; } public static ModInt operator *(long lhs, ModInt rhs) { rhs.value_ = lhs * rhs.value_ % P; return rhs; } public static ModInt operator *(ModInt lhs, long rhs) { lhs.value_ = lhs.value_ * rhs % P; return lhs; } public static ModInt operator /(ModInt lhs, ModInt rhs) { long exp = P - 2; while (exp > 0) { if (exp % 2 > 0) { lhs *= rhs; } rhs *= rhs; exp /= 2; } return lhs; } public static implicit operator ModInt(long n) => new ModInt(n, true); public long ToLong() => value_; public override string ToString() => value_.ToString(); } public class HashMap<TKey, TValue> : Dictionary<TKey, TValue> { private readonly Func<TKey, TValue> initialzier_; public HashMap(Func<TKey, TValue> initialzier) : base() { initialzier_ = initialzier; } public HashMap(Func<TKey, TValue> initialzier, int capacity) : base(capacity) { initialzier_ = initialzier; } new public TValue this[TKey key] { get { if (ContainsKey(key) == false) { base[key] = initialzier_(key); } return base[key]; } set { base[key] = value; } } } public static class Helper { public static void UpdateMin<T>(ref T target, T value) where T : IComparable<T> => target = target.CompareTo(value) > 0 ? value : target; public static void UpdateMin<T>(ref T target, T value, Action<T> onUpdated) where T : IComparable<T> { if (target.CompareTo(value) > 0) { target = value; onUpdated(value); } } public static void UpdateMax<T>(ref T target, T value) where T : IComparable<T> => target = target.CompareTo(value) < 0 ? value : target; public static void UpdateMax<T>(ref T target, T value, Action<T> onUpdated) where T : IComparable<T> { if (target.CompareTo(value) < 0) { target = value; onUpdated(value); } } public static T[] Array<T>(int n, Func<int, T> init) => Enumerable.Range(0, n).Select(x => init(x)).ToArray(); public static List<T> List<T>(int n, Func<int, T> init) => Enumerable.Range(0, n).Select(x => init(x)).ToList(); public static T[,] Array2<T>(int n, int m, T init) { var array = new T[n, m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { array[i, j] = init; } } return array; } public static T[,] Array2<T>(int n, int m, Func<int, int, T> initializer) { var array = new T[n, m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { array[i, j] = initializer(i, j); } } return array; } public static T[,,] Array3<T>(int n1, int n2, int n3, T init) { var array = new T[n1, n2, n3]; for (int i1 = 0; i1 < n1; i1++) { for (int i2 = 0; i2 < n2; i2++) { for (int i3 = 0; i3 < n3; i3++) { array[i1, i2, i3] = init; } } } return array; } private static readonly int[] delta4_ = { 1, 0, -1, 0, 1 }; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void DoAt4(int i, int j, int imax, int jmax, Action<int, int> action) { for (int dn = 0; dn < 4; dn++) { int d4i = i + delta4_[dn]; int d4j = j + delta4_[dn + 1]; if ((uint)d4i < (uint)imax && (uint)d4j < (uint)jmax) { action(d4i, d4j); } } } private static readonly int[] delta8_ = { 1, 0, -1, 0, 1, 1, -1, -1, 1 }; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void DoAt8(int i, int j, int imax, int jmax, Action<int, int> action) { for (int dn = 0; dn < 8; dn++) { int d8i = i + delta8_[dn]; int d8j = j + delta8_[dn + 1]; if ((uint)d8i < (uint)imax && (uint)d8j < (uint)jmax) { action(d8i, d8j); } } } } public class Scanner { private readonly char[] delimiter_ = new char[] { ' ' }; private readonly string filePath_; private readonly Func<string> reader_; private string[] buf_; private int index_; public Scanner(string file = "") { if (string.IsNullOrWhiteSpace(file)) { reader_ = Console.ReadLine; } else { filePath_ = file; var fs = new StreamReader(file); reader_ = fs.ReadLine; } buf_ = new string[0]; index_ = 0; } public string NextLine() => reader_(); public string Next() { if (index_ < buf_.Length) { return buf_[index_++]; } string st = reader_(); while (st == "") { st = reader_(); } buf_ = st.Split(delimiter_, StringSplitOptions.RemoveEmptyEntries); if (buf_.Length == 0) { return Next(); } index_ = 0; return buf_[index_++]; } public int Int() => int.Parse(Next()); public long Long() => long.Parse(Next()); public double Double() => double.Parse(Next()); public int[] ArrayInt(int N, int add = 0) { int[] Array = new int[N]; for (int i = 0; i < N; i++) { Array[i] = Int() + add; } return Array; } public long[] ArrayLong(int N, long add = 0) { long[] Array = new long[N]; for (int i = 0; i < N; i++) { Array[i] = Long() + add; } return Array; } public double[] ArrayDouble(int N, double add = 0) { double[] Array = new double[N]; for (int i = 0; i < N; i++) { Array[i] = Double() + add; } return Array; } public void Save(string text) { if (string.IsNullOrWhiteSpace(filePath_)) { return; } File.WriteAllText(filePath_ + "_output.txt", text); } } }