結果
問題 | No.1210 XOR Grid |
ユーザー |
![]() |
提出日時 | 2020-08-30 14:33:38 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 559 ms / 2,000 ms |
コード長 | 14,399 bytes |
コンパイル時間 | 2,300 ms |
コンパイル使用メモリ | 115,584 KB |
実行使用メモリ | 71,164 KB |
最終ジャッジ日時 | 2024-11-15 07:43:16 |
合計ジャッジ時間 | 13,186 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 57 |
コンパイルメッセージ
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.IO;using System.Linq;using System.Numerics;using System.Reflection.Metadata;using System.Runtime.CompilerServices;using System.Runtime.InteropServices;using System.Text;using System.Text.RegularExpressions;using System.Threading;namespace AtCoder{public class Program{static void Main(){var cin = new Scanner();var (n, m, x) = cin.Int3();var a = cin.ArrayLong(n);var b = cin.ArrayLong(m);long ax = 0;for (int i = 0; i < n; i++) {ax ^= a[i];}long bx = 0;for (int i = 0; i < m; i++) {bx ^= b[i];}if (ax != bx) {Console.WriteLine(0);return;}ModCounting.InitializeFactorial(m + 1);ModInt bit1 = 0;ModInt bit0 = 0;for (int i = 0; i <= m; i++) {if (i % 2 != 0) {bit1 += ModCounting.Combination(m, i);} else {bit0 += ModCounting.Combination(m, i);}}ModInt ans = 1;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < x; j++) {if ((a[i] & 1 << j) != 0) {ans *= bit1;} else {ans *= bit0;}}}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 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 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 static class Helper{[MethodImpl(MethodImplOptions.AggressiveInlining)]public static void UpdateMin<T>(ref T target, T value) where T : IComparable<T>=> target = target.CompareTo(value) > 0 ? value : target;[MethodImpl(MethodImplOptions.AggressiveInlining)]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);}}[MethodImpl(MethodImplOptions.AggressiveInlining)]public static void UpdateMax<T>(ref T target, T value) where T : IComparable<T>=> target = target.CompareTo(value) < 0 ? value : target;[MethodImpl(MethodImplOptions.AggressiveInlining)]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);}}[MethodImpl(MethodImplOptions.AggressiveInlining)]public static T[] Array<T>(int n, Func<int, T> init)=> Enumerable.Range(0, n).Select(x => init(x)).ToArray();[MethodImpl(MethodImplOptions.AggressiveInlining)]public static List<T> List<T>(int n, Func<int, T> init)=> Enumerable.Range(0, n).Select(x => init(x)).ToList();[MethodImpl(MethodImplOptions.AggressiveInlining)]public static T[,] Array2<T>(int n, int m, T init)where T : struct{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;}[MethodImpl(MethodImplOptions.AggressiveInlining)]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;}[MethodImpl(MethodImplOptions.AggressiveInlining)]public static T[,,] Array3<T>(int n1, int n2, int n3, T init)where T : struct{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;}[MethodImpl(MethodImplOptions.AggressiveInlining)]public static T[,,,] Array4<T>(int n1, int n2, int n3, int n4, T init)where T : struct{var array = new T[n1, n2, n3, n4];for (int i1 = 0; i1 < n1; i1++) {for (int i2 = 0; i2 < n2; i2++) {for (int i3 = 0; i3 < n3; i3++) {for (int i4 = 0; i4 < n4; i4++) {array[i1, i2, i3, i4] = 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);}}}[MethodImpl(MethodImplOptions.AggressiveInlining)]public static void ForEachSubBit(int bit, Action<int> action){for (int sub = bit; sub >= 0; sub--) {sub &= bit;action(sub);}}[MethodImpl(MethodImplOptions.AggressiveInlining)]public static string Reverse(string src){var chars = src.ToCharArray();for (int i = 0, j = chars.Length - 1; i < j; i++, j--) {var tmp = chars[i];chars[i] = chars[j];chars[j] = tmp;}return new string(chars);}[MethodImpl(MethodImplOptions.AggressiveInlining)]public static string Join<T>(this IEnumerable<T> values, string separator = "")=> string.Join(separator, values);}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;}[MethodImpl(MethodImplOptions.AggressiveInlining)]public string NextLine() => reader_();[MethodImpl(MethodImplOptions.AggressiveInlining)]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_++];}[MethodImpl(MethodImplOptions.AggressiveInlining)]public int Int() => int.Parse(Next());[MethodImpl(MethodImplOptions.AggressiveInlining)]public int Int(int offset) => int.Parse(Next()) + offset;[MethodImpl(MethodImplOptions.AggressiveInlining)]public (int, int) Int2(int offset = 0)=> (Int(offset), Int(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public (int, int, int) Int3(int offset = 0)=> (Int(offset), Int(offset), Int(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public (int, int, int, int) Int4(int offset = 0)=> (Int(offset), Int(offset), Int(offset), Int(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public int[] ArrayInt(int length, int offset = 0){int[] Array = new int[length];for (int i = 0; i < length; i++) {Array[i] = Int(offset);}return Array;}[MethodImpl(MethodImplOptions.AggressiveInlining)]public long Long() => long.Parse(Next());[MethodImpl(MethodImplOptions.AggressiveInlining)]public long Long(long offset) => long.Parse(Next()) + offset;[MethodImpl(MethodImplOptions.AggressiveInlining)]public (long, long) Long2(long offset = 0)=> (Long(offset), Long(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public (long, long, long) Long3(long offset = 0)=> (Long(offset), Long(offset), Long(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public (long, long, long, long) Long4(long offset = 0)=> (Long(offset), Long(offset), Long(offset), Long(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public long[] ArrayLong(int length, long offset = 0){long[] Array = new long[length];for (int i = 0; i < length; i++) {Array[i] = Long(offset);}return Array;}[MethodImpl(MethodImplOptions.AggressiveInlining)]public double Double() => double.Parse(Next());[MethodImpl(MethodImplOptions.AggressiveInlining)]public double Double(double offset) => double.Parse(Next()) + offset;[MethodImpl(MethodImplOptions.AggressiveInlining)]public (double, double) Double2(double offset = 0)=> (Double(offset), Double(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public (double, double, double) Double3(double offset = 0)=> (Double(offset), Double(offset), Double(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public (double, double, double, double) Double4(double offset = 0)=> (Double(offset), Double(offset), Double(offset), Double(offset));[MethodImpl(MethodImplOptions.AggressiveInlining)]public double[] ArrayDouble(int length, double offset = 0){double[] Array = new double[length];for (int i = 0; i < length; i++) {Array[i] = Double(offset);}return Array;}public void Save(string text){if (string.IsNullOrWhiteSpace(filePath_)) {return;}File.WriteAllText(filePath_ + "_output.txt", text);}}}