結果
問題 | No.3012 岩井星人グラフ |
ユーザー |
|
提出日時 | 2025-02-02 03:34:54 |
言語 | C# (.NET 8.0.404) |
結果 |
AC
|
実行時間 | 206 ms / 2,000 ms |
コード長 | 19,474 bytes |
コンパイル時間 | 11,508 ms |
コンパイル使用メモリ | 173,796 KB |
実行使用メモリ | 195,468 KB |
最終ジャッジ日時 | 2025-02-02 03:35:17 |
合計ジャッジ時間 | 19,973 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 23 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (139 ミリ秒)。 main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Numerics; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using static System.Console; using static System.Math; using static Contest.PrimeNumber; namespace Contest { internal class Program { private static void Solve() { var N = InputNum().ToInt(); var M = InputNum().ToInt(); var ans = new List<List<int>>(); ans.Add(new List<int>() { N * M, N * M }); for (var i = 1; i <= N; i++) { if (i != N) ans.Add(new List<int>() { i, i + 1 }); else ans.Add(new List<int>() { 1, N }); } var margin = 0; var from = 0; var to = 0; for (var i = 1; i <= N; i++) { for (var j = 0; j < M - 1; j++) { if (j == 0) { from = i; to = i + N + margin; ans.Add(new List<int>() { from, to }); } else { ans.Add(new List<int>() { to, to + 1 }); to++; } } margin += M - 2; } for (var i = 0; i < ans.Count; i++) Output(ans[i]); } static void Main(string[] args) { var sw = new StreamWriter(OpenStandardOutput()) { AutoFlush = false }; SetOut(sw); Solve(); Out.Flush(); } static readonly Scanner sc = new Scanner(); static long InputNum() { return sc.NextLong(); } static List<long> InputNums(long n) { var li = new List<long>(); for (var i = 0; i < n; i++) li.Add(InputNum()); return li; } static List<List<long>> InputsNums(long h, long w) { var li = new List<List<long>>(); for (var i = 0; i < h; i++) li.Add(InputNums(w)); return li; } static string InputString() { return sc.Next(); } static string InputStringLine() { return sc.NextLine(); } static List<string> InputStrings(long n) { var li = new List<string>(); for (var i = 0; i < n; i++) li.Add(InputString()); return li; } static List<string> InputStringLines(long n) { var li = new List<string>(); for (var i = 0; i < n; i++) li.Add(InputStringLine()); return li; } static List<List<string>> InputsStrings(long h, long w) { var li = new List<List<string>>(); for (var i = 0; i < h; i++) li.Add(InputStrings(w)); return li; } static void Output(object n) => WriteLine(n.ToString()); static void Output(string n) => WriteLine(n); static void Output(bool n, string t = "Yes", string f = "No") => WriteLine(n ? t : f); static void Output<T>(IEnumerable<T> ts, string sep = " ") => WriteLine(string.Join(sep, ts)); } #region いろいろ public static class Methods { /// <summary> /// 型変換 /// </summary> #region ToNum public static int ToInt(this object target) { _ = int.TryParse(target.ToString(), out var val); return val; } public static long ToLong(this object target) { _ = long.TryParse(target.ToString(), out var val); return val; } public static byte ToByte(this object target) { _ = byte.TryParse(target.ToString(), out var val); return val; } public static float ToFloat(this object target) { _ = float.TryParse(target.ToString(), out var val); return val; } public static double ToDouble(this object target) { _ = double.TryParse(target.ToString(), out var val); return val; } public static decimal ToDecimal(this object target) { _ = decimal.TryParse(target.ToString(), out var val); return val; } #endregion /// <summary> /// 文字配列から文字列 /// </summary> #region CharsToString public static string CharsToString(this IEnumerable<char> n) { return string.Join("", n); } #endregion /// <summary> /// 間に含まれているかどうか /// </summary> /// <param name="isInclude">true:以上以下,false:超過未満</param> #region Between public static bool Between<T>(this T target, T item1, T item2, bool isInclude = true) where T : IComparable<T> { var low = item1; var high = item2; if (low.CompareTo(high) > 0) { low = item2; high = item1; } if (isInclude) return target.CompareTo(low) >= 0 && target.CompareTo(high) <= 0; else return target.CompareTo(low) > 0 && target.CompareTo(high) < 0; } #endregion /// <summary> /// 交換(値型,構造体のみ) /// </summary> #region Swap public static void Swap<T>(ref T target, ref T item) where T : struct { (target, item) = (item, target); } #endregion /// <summary> /// 順列列挙 /// </summary> /// <param name="withRepetition">各要素自身の重複</param> #region Permutation public static IEnumerable<T[]> Permutation<T>(this IEnumerable<T> items, int k, bool withRepetition = false) { if (k == 1) { foreach (var item in items) { yield return new T[] { item }; } yield break; } foreach (var item in items) { var leftside = new T[] { item }; var unused = withRepetition ? items : items.Except(leftside); foreach (var rightside in Permutation(unused, k - 1, withRepetition)) { yield return leftside.Concat(rightside).ToArray(); } } } #endregion /// <summary> /// 組み合わせ列挙 /// </summary> /// <param name="withRepetition">各要素自身の重複</param> #region Combination public static IEnumerable<T[]> Combination<T>(this IEnumerable<T> items, int k, bool withRepetition = false) { if (k == 1) { foreach (var item in items) yield return new T[] { item }; yield break; } foreach (var item in items) { var leftside = new T[] { item }; var unused = withRepetition ? items : items.SkipWhile(e => !e.Equals(item)).Skip(1).ToList(); foreach (var rightside in Combination(unused, k - 1, withRepetition)) { yield return leftside.Concat(rightside).ToArray(); } } } #endregion /// <summary> /// フィボナッチ /// </summary> /// <param name="isZeroStart">初項0</param> #region GetFibonacci public static long GetFibonacci(int n, bool isZeroStart = true) { if (n == 0) return isZeroStart ? 0 : 1; if (n == 1) return 1; var dp = new long[n + 1]; dp[0] = isZeroStart ? 0 : 1; dp[1] = 1; for (var i = 2; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; } #endregion /// <summary> /// <para>Lower_Bound</para> /// <para>{0,0,1,1,2,2,3,3}(2)なら return 4</para> /// </summary> /// <returns>value以上の値の最小インデックス,無ければ-1</returns> #region BoundLower public static int BoundLower<T>(this IList<T> values, T value) { if (values.Count == 0) return -1; var cmp = Comparer<T>.Default; if (cmp.Compare(values[0], values.Last()) > 0) throw new Exception("BoundLower"); if (cmp.Compare(values[0], value) >= 0) return 0; if (cmp.Compare(values.Last(), value) < 0) return -1; var left = 0; var right = values.Count - 1; while (left <= right) { var mid = (left + right) / 2; // 中点取得 var res = cmp.Compare(values[mid], value); if (res == -1) left = mid + 1; else right = mid - 1; } return left; } #endregion /// <summary> /// <para>Lower_Bound_Desc</para> /// <para>{3,3,2,2,1,1,0,0}(2)なら return 2</para> /// </summary> /// <returns>value以下の最小インデックス,無ければ-1</returns> #region BoundLowerDesc public static int BoundLowerDesc<T>(this IList<T> values, T value) { if (values.Count == 0) return -1; var cmp = Comparer<T>.Default; if (cmp.Compare(values[0], values.Last()) < 0) throw new Exception("BoundLowerDesc"); if (cmp.Compare(values[0], value) <= 0) return 0; if (cmp.Compare(values.Last(), value) > 0) return -1; var left = 0; var right = values.Count - 1; while (left <= right) { var mid = (left + right) / 2; // 中点取得 var res = cmp.Compare(values[mid], value); if (res == 1) left = mid + 1; else right = mid - 1; } return left; } #endregion /// <summary> /// <para>Upper_Bound</para> /// <para>{0,0,1,1,2,2,3,3}(2)なら return 6</para> /// </summary> /// <returns>valueより大きい最小インデックス,無ければ-1</returns> #region BoundUpper public static int BoundUpper<T>(this IList<T> values, T value) { if (values.Count == 0) return -1; var cmp = Comparer<T>.Default; if (cmp.Compare(values[0], values.Last()) > 0) throw new Exception("BoundUpper"); if (cmp.Compare(values[0], value) > 0) return 0; if (cmp.Compare(values[values.Count - 1], value) <= 0) return -1; var left = 0; var right = values.Count - 1; while (left <= right) { var mid = (left + right) / 2; // 中点取得 var res = cmp.Compare(values[mid], value); if (res <= 0) left = mid + 1; else right = mid - 1; } return left; } #endregion /// <summary> /// <para>Upper_Bound_Desc</para> /// <para>{3,3,2,2,1,1,0,0}(2)なら return 4</para> /// </summary> /// <returns>value未満の最小インデックス,無ければ-1</returns> #region BoundUpperDesc public static int BoundUpperDesc<T>(this IList<T> values, T value) { if (values.Count == 0) return -1; var cmp = Comparer<T>.Default; if (cmp.Compare(values[0], values.Last()) < 0) throw new Exception("BoundUpperDesc"); if (cmp.Compare(values[0], value) < 0) return 0; if (cmp.Compare(values.Last(), value) >= 0) return -1; var left = 0; var right = values.Count - 1; while (left <= right) { var mid = (left + right) / 2; // 中点取得 var res = cmp.Compare(values[mid], value); if (res >= 0) left = mid + 1; else right = mid - 1; } return left; } #endregion /// <summary> /// 距離取得 /// </summary> /// <param name="isEuclidean">true:直線距離,false:縦横距離</param> #region GetDistance public static decimal GetDistance<T>(this (T, T) point1, (T, T) point2, bool isEuclidean = true) { var X = Abs(point1.Item1.ToDecimal() - point2.Item1.ToDecimal()); var Y = Abs(point1.Item2.ToDecimal() - point2.Item2.ToDecimal()); return isEuclidean ? Sqrt((X * X + Y * Y).ToDouble()).ToDecimal() : X + Y; } #endregion /// <summary> /// bit全探索用のリスト作成 /// </summary> #region CreateBitArrays public static IEnumerable<bool[]> CreateBitArrays(this int n) { var list = new List<bool[]>(); for (var bit = 0; bit < (1 << n); bit++) { list.Add(new bool[n]); for (var i = 0; i < n; i++) { list[bit][i] = (bit & (1 << i)) != 0; } } return list.AsEnumerable(); } #endregion /// <summary> /// N個からR個選ぶ順列 /// </summary> #region NPR public static long NPR(this int num1, int num2) { if (num1 < num2) return 0; var ans = 1L; for (var i = 0; i < num2; i++) ans *= num1 - i; return ans; } #endregion /// <summary> /// N個からR個選ぶ組み合わせ /// </summary> #region NCR public static long NCR(this int num1, int num2) { if (num1 < num2) return 0; if (num2 > num1 / 2) num2 = num1 - num2; var ans = 1L; for (var i = 0; i < num2; i++) ans *= num1 - i; for (var i = num2; i >= 2; i--) ans /= i; return ans; } #endregion } #endregion /// <summary> /// 標準入力クラス /// </summary> #region Scanner class Scanner { string[] _str; int _int; public Scanner() { _str = new string[0]; _int = 0; } public string Next() { if (_int < _str.Length) return _str[_int++]; var st = ReadLine()?.Trim(); while (st == "") st = ReadLine(); if (st != null) _str = Split(st, ' '); if (_str.Length == 0) return Next(); _int = 0; return _str[_int++]; } public string NextLine() { if (_int < _str.Length) { var s = " " + string.Join(" ", _str.Skip(_int++)); _str = new string[0]; return s; } var st = ReadLine()?.Trim(); while (st == "") st = ReadLine()?.Trim(); _str = new string[] { st }; _int = 0; return _str[_int++]; } private static string[] Split(string st, char sep = ' ') { var sb = new StringBuilder(); var li = new List<string>(); for (var i = 0; i < st.Length; i++) { if (st[i] == sep) { if (sb.ToString() != "") li.Add(sb.ToString()); sb.Clear(); } else { sb.Append(st[i]); } } if (sb.ToString() != "") li.Add(sb.ToString()); return li.ToArray(); } public int NextInt() { return int.Parse(Next()); } public long NextLong() { return long.Parse(Next()); } public double NextDouble() { return double.Parse(Next()); } } #endregion /// <summary> /// 素数 /// </summary> #region PrimeNumber public static class PrimeNumber { public static long[] Primes = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 }; /// <summary> /// 素数判定 /// </summary> #region 素数判定 public static bool IsPrime(long num) { if (num <= 1) return false; if (Primes.Contains(num)) return true; if (Primes.Any(x => num % x == 0)) return false; for (var i = 101L; i * i <= num; i += 2) { if (num % i == 0) return false; } return true; } #endregion /// <summary> /// 素因数分解 /// </summary> #region 素因数分解 public static List<long[]> PrimeFactorization(long n) { if (n <= 1) return new List<long[]>(); var primes = new List<long[]>(); for (var i = 2L; i * i <= n; i++) { if (!IsPrime(i)) continue; var e = (long)0; while (n % i == 0) { e++; n /= i; } primes.Add(new long[] { i, e }); } if (n != 1) primes.Add(new long[] { n, 1 }); return primes; } #endregion /// <summary> /// 2数の最大公約数 /// </summary> #region 最大公約数 public static long GreatestCommonDivisor(long num1, long num2) { var low = num1 <= num2 ? num1 : num2; var high = num1 <= num2 ? num2 : num1; var temp = (long)0; while (true) { if (high % low == 0) return low; temp = high % low; high = low; low = temp; } } #endregion /// <summary> /// 2数の最小公倍数 /// </summary> #region 最小公倍数 public static long LeastCommonMultiple(long num1, long num2) { return num1 * num2 / GreatestCommonDivisor(num1, num2); } #endregion } #endregion }