競プロをしながら、節約と株式投資でセミリタイアを目指す東大卒のブログ

東大卒でメーカー勤務の私がセミリタイアするために投資や競プロを頑張っていこうという趣旨で始めたブログです。独身男性です。お金の大切さや今後の生き方も併せて伝えられたらと思います。

Judge System Update Test Contest 202004で書いたコード

using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace Atcoder20200405
{
    class ProgramA
    {
        static void Main(string args)
        {
            //入力
            string a = Console.ReadLine().Split(' ');
            long s = long.Parse(a[0]);
            long l = long.Parse(a[1]);
            long r = long.Parse(a[2]);

            //sの位置に応じて場合分けする
            if(s < l)
                Console.WriteLine(l);
            else if(r < s)
                Console.WriteLine(r);
            else
                Console.WriteLine(s);
        }
    }

    class ProgramB
    {
        static void Main(string args)
        {
            
            //入力
            int n = int.Parse(Console.ReadLine());
            var r = new List<int>();
            var b = new List<int>();

            //RかBかでそれぞれリストを作る
            for(int i = 0;i < n;i++)
            {
                string a = Console.ReadLine().Split(' ');
                if(a[1] == "R")
                    r.Add(int.Parse(a[0]));
                else
                    b.Add(int.Parse(a[0]));
            }
            
            //それぞれソートする
            r.Sort();
            b.Sort();

            //Rの方を小さい順に取り出す
            foreach(var s in r)
            {
                Console.WriteLine(s);
            }

            //Bの方を小さい順に取り出す
            foreach(var s in b)
            {
                Console.WriteLine(s);
            }

        }
    }

    class ProgramC
    {
        //あらかじめ設定したものはそのままやる
        public static int a1;
        public static int a2;
        public static int a3;
        public static int ans = 0;
        static void Main(string args)
        {
            
            //入力
            string s = Console.ReadLine().Split(' ');
            a1 = int.Parse(s[0]);
            a2 = int.Parse(s[1]);
            a3 = int.Parse(s[2]);

            //深さ優先検索
            dfs(1,0,0);

            Console.WriteLine(ans);

        } 

        //積立方法を考える
        static void dfs(int xint yint z)
        {
            //もし、規定より大きくなればそれは満たさないので省く
            if(a1 < x || a2 < y || a3 < z)
                return;

            //もし、今の積み方が満たすならカウントする
            if(x == a1 && y == a2 && z == a3)
            {
                ans++;
                return;
            }

            //とりあえず縦に積むケース
            dfs(x + 1yz);
            //xよりyが小さければ積むことができるのでそのケースを見る
            if(x > y
                dfs(xy + 1z);
            //同様にyよりzが小さければ積むことができるのでそのケースを見る
            if(y > z
                dfs(xyz + 1);
            
        }
    }  

    class ProgramD
    {
        static void Main(string args)
        {
            
            //入力
            string p = Console.ReadLine().Split(' ');
            long n = long.Parse(p[0]);
            long q = long.Parse(p[1]);

            string a = Console.ReadLine().Split(' ');
            long an = new long[n];
            long gcdn = new long[n];

            for(int i = 0i < n;i++)
                an[i] = long.Parse(a[i]);
            
            //i番目までの最大公約数を求めておく(メモ化)
            for(int i = 0i < n;i++)
            {
                if(i == 0)
                {
                   gcdn[0] = an[0];
                   continue;
                }

                gcdn[i] = gcd(an[i], gcdn[i -1]);
            }
            
            string s = Console.ReadLine().Split(' ');

            for(int i = 0i < q;i++)
            {
                long t = long.Parse(s[i]);
                //最後の数と比較して公約数があるか見る
                if(gcd(gcdn[n-1], t) != 1)  
                {
                    //公約数があると最後まで割り切れないので答えはその最大公約数
                    Console.WriteLine(gcd(gcdn[n-1], t));
                    continue;
                }

                //どこであるか判定
                long max = n - 1;
                long min = 0;
                long temp = 0;
            
                //二分探索法。
                while(max != min + 1)
                {
                    //とりあえず真ん中の数でそれより大きいか小さいかを探す
                    temp = (max + min) /2;

                    //実際最小公約数を求めて1ならより小さい解を、それ以外は大きい解を考える
                    if(gcd(gcdn[temp], t) == 1)
                        max = temp;
                    else
                        min = temp;
                }

                //この探索だとminの保障はないため最後に確認
                if(gcd(gcdn[min - 1], t) == 1)
                    Console.WriteLine(min + 1);
                else
                    Console.WriteLine(max + 1);
            }
        }

        /*最大公約数を求める関数*/
        static long gcd(long plong q)
        {
            if(p < q)
            {
                long temp = p;
                p = q;
                q = temp;
            }

            long r = 1;

            while(r != 0)
            {
                r = p % q;
                p = q;
                q = r;
            }

            return p;
        }
 
    } 

    
    
}