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

東大卒でメーカー勤務の私がセミリタイアするために投資や競プロを頑張っていこうという趣旨で始めたブログです。独身男性です。火木土日に更新予定です。お金について考えています。

ABC145で書いたコード

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

namespace Atcoder20190616
{
    class ProgramA
    {
        static void Main(string args)
        {
            //数値入力する
            string input = Console.ReadLine();
            int r = int.Parse(input);

            //r*rを出力
            Console.WriteLine(r*r);
                
        }
    }

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

            string s = Console.ReadLine();


            //文字列が奇数ならありえないのでNo
            if(s.Length % 2 == 1)
            {
                Console.WriteLine("No");
                return;
            }


            //偶数であればi文字目と、n/2+i文字目は一致しているので一致しない場合は除く
            for(int i = 0;i < n/2;i++)
            {
                if(s[i!= s[n/2 + i])
                    Console.WriteLine("No");
            }

            //それ以外は正しい
            Console.WriteLine("Yes");
                
        }
    }

    class ProgramC
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine();
            int n = int.Parse(input);
            int x = new int[n];
            int y = new int[n];


            //とりあえずx,yをそれぞれ入力
            for(int i = 0;i < n;i++)
            {
                string input_2 = Console.ReadLine().Split();
                x[i= int.Parse(input_2[0]);
                y[i= int.Parse(input_2[1]);
            }

            double ans = 0;

            //すべての通りの距離を足し合わせる
            for(int i = 0;i < n;i++)
                for(int j = i + 1;j < n ;j++)
                {
                    ans += Math.Sqrt((x[i-  x[j]) * (x[i-  x[j]) + (y[i-  y[j]) * (y[i-  y[j]));
                }

            //答え出力(すべての距離に2/Nをかけたものが答え
            Console.WriteLine(ans * 2.0 /(double)(n));
                
        }
    }

    class ProgramD
    {
        static void Main(string args)
        {
            
            //入力
            string[] input = Console.ReadLine().Split();
            long x = long.Parse(input[0]);
            long y = long.Parse(input[1]);
            long mod = 1000000000 + 7; //割る数


            //座標の和が3で割り切れないときはknightは到達しない
            if( (x+y% 3 != 0)
            {
                Console.WriteLine("0");
                return;
            }

            long m = 0;
            long n = 0;

            //(2,1)と(1,2)の移動回数をそれぞれm,nとする
            m = (2*x-y)/3;
            n = (2*y-x)/3;



            //それぞれの場合で答えを出す
            if(m < 0 || n < 0) //片方が負なら到達しない
            {
                Console.WriteLine("0");
                return;
            }
            else if(m == 0 || n == 0) //一方が0回なら答えは1通り
            {
                Console.WriteLine("1");
                return;
            }
            else //それ以外はm+nCnを求める
            {
                //nが常に小さいようにする
                if(m < n)
                {
                    long temp = n;
                    n = m;
                    m = temp;
                }
                
                long ans = 1;
                //分子の方をかける
                for(long i = 1;i <= n;i++)
                {
                    ans = (ans * (m + n - i + 1)) % mod;
                }

                //分母の方を割る
                for(long i = 2;i <= n;i++)
                {
                    ans = ans * modinv(i,mod% mod;
                }

                //答えを出力
                Console.WriteLine(ans);                    

                
            }

        }

        // mod. m での a の逆元 a^{-1} を計算する
        static long modinv(long along m)
         {
            long b = mu = 1v = 0;
            while (b > 0)
            {
                //こちらは普通のユークリッドの互除法
                long t = a / b;
                a -= t * b
                var temp = a;
                a = b;
                b = temp;
                //こっちは逆算すると解が出る
                u -= t * v
                var temp2 = u;
                u = v;
                v = temp2;
            }
            u %= m;
            if (u < 0
                u += m;
            return u;
        }
    }
           
}