東大卒メーカー勤務がゆるっとセミリタイアを目指す

東大卒でメーカー勤務の私がセミリタイアするために考えたことや日々思うことをゆるっと書いていくブログです。独身男性です。お金の大切さや今後の生き方について伝えていけたらと思います。

ABC150で書いたコード

using System;
using System.Linq;
using System.Collections.Generic;

namespace Atcoder20190616
{
    class ProgramA
    {
        static void Main(string args)
        {
            //入力
            string input = Console.ReadLine().Split(' ');
            int x = int.Parse(input[0]);
            int k = int.Parse(input[1]);

            //x*500 >= KならYes、それ以外ならNo
            if(x*500 >= k)
                Console.WriteLine("Yes");
            else
            {
                Console.WriteLine("No");
            }
                
        }
    }

    class ProgramB
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine();
            long n = long.Parse(input);
            string s = Console.ReadLine();
            long count = 0;


            //全探索、s[i] == 'A' && s[i + 1] == 'B' && s[i + 2] == 'C'の数を数える
            for(int i = 0;i < n - 2;i++) 
            {
                if(s[i] == 'A' && s[i + 1] == 'B' && s[i + 2] == 'C')
                {
                    count++;
                    i += 2;
                }
            }

            //出力
            Console.WriteLine(count);
                
        }
    }

    class ProgramC
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine();
            int n = int.Parse(input);
            string input_P = Console.ReadLine().Split(' ');
            int P = new int[n];
            for(int i = 0;i < n;i++)
                P[i] = int.Parse(input_P[i]);
            string input_Q = Console.ReadLine().Split(' ');
            int Q = new int[n];
            for(int i = 0;i < n;i++)
                Q[i] = int.Parse(input_Q[i]);


            //すべての数を取り換えず数える
            int sum = 1;
            for(int i = 0i < n;i++)
                sum *= i + 1;

             
            int a = 0;
            int b = 0;

            for(int i = 0i < n - 1;i++)
            {
                int temp = P[i];
                //sumを割ることで、その数を頭にしたときにありうる全数を算出する。
                sum /= (n - i);
                if(i == 0)
                { //最初の数で辞書の順序は決まる
                    a = (P[i] - 1)* sum + 1;
                    b = (Q[i] - 1)* sum + 1;
                }
                else
                {
                    for(int j = ij < n ;j++)
                    {
                        //前の数字はもうないので、それより後の数は引いて、辞書的に前にもっていく
                        if(P[j] > P[i - 1])
                            P[j]--;
                    }
                    for(int j = ij < n ;j++)
                    {
                        //前の数字はもうないので、それより後の数は引いて、辞書的に前にもっていく
                        if(Q[j] > Q[i - 1])
                            Q[j]--;
                    }
                    
                    a += (P[i] - 1)* sum + 1;
                    b += (Q[i] - 1)* sum + 1;
                }
                
            }
                
            //答え出力
            Console.WriteLine(Math.Abs(a - b));
          
        } 
    }

    class ProgramD
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            ulong m = ulong.Parse(input[1]);
            string input_a = Console.ReadLine().Split(' ');
            ulong ai = new ulong[n];
            ulong[] bi = new ulong[n];
            //2で割った数をとりあえず代入
            for(int i = 0;i < n;i++)
            {
                ai[i] = ulong.Parse(input_a[i]) / 2;
                bi[i] = ai[i];
            }
            
            // n=1は例外なので別に処理
            if(n == 1)
            {
                if(ai[0] > m) //aがmを超えるとあり得ないので
                    Console.WriteLine('0');
                else //aの奇数倍が答
                    Console.WriteLine((m - ai[0]) / 2 / ai[0] + 1);
                return;
            }


            //すべての数は2で割る回数が同じでないといけない(満たさないならば0)
            for(int j = 0j < 50;j++)
            {
                int count = 0;
                for(int i = 0;i < n;i++)
                {
                    int temp = (int)(bi[i] % 2);//2で割り切れるか判定
                    if(temp == 0)//割り切れるときはカウントして、さらに割り切れるか数えてみる
                    {
                        count++;
                        bi[i] /= 2;
                    }
                }
                if(count != 0 && count != n)//全部割り切れないか全部割り切れる以外は条件を満たさないので0
                    {
                        Console.WriteLine('0');
                        return;
                    }
            }

            //その条件を満たしたときすべての数の最小公倍数の奇数倍の数が答え
            Array.Sort(ai);
            ulong a = ai[n - 1];
            ulong b = ai[n - 2];
            ulong tempa = a;
            ulong tempb = b;
            ulong r = 1;

            //ユークリッドの互除法(大きい2つの数で求める)
            whiler != 0 ) 
            {
                r = a % b;
                a = b;
                b = r;
            }

            //最小公倍数を出す
            a = tempa * tempb / a;

            if(a > m)
            {
                Console.WriteLine('0');
                return;
            }

            //おおきい順で最小公倍数を出していく
            for(int i = n - 3;i >= 0i--)
            {
                ulong temp2a = a;//保存した最小公倍数
                b = ai[i];//次に比較する数
                ulong temp2b = ai[i];
                r = 1;
                whiler != 0 ) 
                {
                    r = a % b;
                    a = b;
                    b = r;
                }

                a = temp2a * temp2b / a;//新しい最小公倍数

                //mを超えたら答はない
                if(a > m)
                {
                    Console.WriteLine('0');
                    return;
                }

            }
        
            //すべての最小公倍数の奇数倍が答え
            Console.WriteLine((m - a) / 2 / a + 1);
        }
        
    }        
}