結果

問題 No.3012 岩井星人グラフ
ユーザー usk
提出日時 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/

ソースコード

diff #

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
}
0