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

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

ABC156で書いたコード

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

namespace Atcoder20190616
{

    class ProgramA
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int r = int.Parse(input[1]);
            
            //試行回数が10回以下ならレートを補正する。それ以外は普通に出力
            if(n < 10)
                Console.WriteLine(r + (10 -n)*100);
            else
                Console.WriteLine(r);
            
 
            
    
        }
    }

    class ProgramB
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int k = int.Parse(input[1]);
            int count = 0;
            
            //0なるまで何回割れるか求める
            while(n != 0)
            {
                n /= k;
                count++;
            }
 
            Console.WriteLine(count);
    
        }
    }

    class ProgramC
    {
        static void Main(string args)
        {
            
            //入力
            int n = int.Parse(Console.ReadLine());
            string input = Console.ReadLine().Split(' ');
            int sum = 0;
            int ans = 100000000;
            
 
            //すべての和を求める
            for(int i = 0;i < 100;i++)
            {
                for(int j = 0;j < n ;j++)
                {
                    int temp  = int.Parse(input[j]);
                    sum += (temp - i)*(temp -i);
                }

                //その和が最小なら更新する
                if(sum < ans)
                    ans = sum;
                //リセット
                sum = 0;
            }
 
            //答え出力
            Console.WriteLine(ans);
        } 
    }  

    class ProgramD
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            long n = long.Parse(input[0]);
            long a = long.Parse(input[1]);
            long b = long.Parse(input[2]);
 
            long MOD = 1000000000 + 7;
 
            
            
            //まずは総和を計算
            //BigIntegerを使う方法
            BigInteger temp10 = System.Numerics.BigInteger.ModPow(2nMOD);
            long ans = (long)temp10;
            
 
            if(n/2 < a)
                 a = n - a;
            
            if(n/2 < b)
                 b = n - b;
 
            long a_sum = 1;
            long b_sum = 1;

            //分子の方をかける
            for(long i = 0;i < a;i++)
            {
                    a_sum *= n - i;
                    a_sum %= MOD;
            }
 
            //分母の方を割る
            for(long i = 0;i < a;i++)
            {
                a_sum = a_sum * modinv(i + 1,MOD) % MOD;
            }
 
            //分子の方をかける
            for(long i = 0;i < b;i++)
            {
                    b_sum *= n - i;
                    b_sum %= MOD;
            }
 
            //分母の方を割る
            for(long i = 0;i < b;i++)
            {
                b_sum = b_sum * modinv(i + 1,MOD) % MOD;
            }

            //最初の数からa,bのケースを引く
            ans -= a_sum;
            ans -= b_sum;
            ans -= 1;
            //最後に割る
            ans %= MOD;

            //負のときは絶対値を戻す
            if(ans < 0)
                ans = MOD - Math.Abs(ans);

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

        //繰り返し二乗法で求める
        static long modpow(long along n,long MOD)
        {
            if(n == 0)
                return 1;
            if(n % 2 == 0)
            {
                long temp = modpow(an/2M);
                return temp*temp % MOD;
            }
            
            return a * modpow(a,n-1,MOD);
        }
         
      // 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;
        }
    }

    class ProgramD:part2
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            long n = long.Parse(input[0]);
            long a = long.Parse(input[1]);
            long b = long.Parse(input[2]);
 
            long MOD = 1000000000 + 7;
 
            
            
            //まずは総和を計算
            //繰り返し二乗法を使う方法
            long ans = modpow(2,n,MOD);
            
 
            if(n/2 < a)
                 a = n - a;
            
            if(n/2 < b)
                 b = n - b;
 
            long a_sum = 1;
            long b_sum = 1;
            long a_sum_u = 1;
            long b_sum_u = 1;

            //分子の方をかける
            for(long i = 0;i < a;i++)
            {
                a_sum *= n - i;
                a_sum %= MOD;
            }
 
            //分母の方をかける
            for(long i = 0;i < a;i++)
            {
                a_sum_u *= (i + 1);
                a_sum_u %= MOD;
            }

            //nCaを求める
            a_sum = a_sum * modpow(a_sum_u,MOD-2,MOD);
 
            //分子の方をかける
            for(long i = 0;i < b;i++)
            {
                b_sum *= n - i;
                b_sum %= MOD;
            }
 
            //分母の方をかける
            for(long i = 0;i < b;i++)
            {
                b_sum_u *= (i + 1);
                b_sum_u %= MOD;
            }

            //nCbを求める
            b_sum = b_sum * modpow(b_sum_u,MOD-2,MOD);


            //最初の数からa,bのケースを引く
            ans -= a_sum;
            ans -= b_sum;
            ans -= 1;
            //最後に割る
            ans %= MOD;

            //負のときは絶対値を戻す
            if(ans < 0)
                ans = MOD - Math.Abs(ans);

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

        //繰り返し二乗法で求める
        static long modpow(long along n,long MOD)
        {
            if(n == 0)
                return 1;
            if(n % 2 == 0)
            {
                long temp = modpow(an/2MOD);
                return temp*temp % MOD;
            }
            
            return a * modpow(a,n-1,MOD) % MOD;
        }
    }

    class ProgramE
    {
        static void Main(string args)
        {

            //入力
            string input = Console.ReadLine().Split(' ');
            long n = long.Parse(input[0]);
            long k = long.Parse(input[1]);

            long MOD = 1000000000 + 7;
            long sum = 0;

            //下準備
            nCk com = new nCk();
            com.fac = new long[n + 1];
            com.inv = new long[n + 1];
            com.finv = new long[n + 1];
            com.mod = MOD;
            com.max = n + 1;

            //メモ作成
            com.com_init();
            
            //最大の部屋の数を考える
            long m = n;
           if(n > k)
                m = k + 1;

            //nCm×n-mHm = nCm×n-1Cn-m-1の和を出す
            for(long i = 0;i < m;i++)
            {
                sum += com.com(ni) * com.com(n - 1n - i - 1) % MOD;
                sum %= MOD;
            }

            //出力
            Console.WriteLine(sum);

        }

    }

    class nCk
    {
        public long mod;
        public long max;
        public long fac;
        public long inv;
        public long[] finv;
        

        //メモ作成(前準備)
        public void com_init()
        {
            fac[0] = 1;
            fac[1] = 1;
            finv[0] = 1;
            finv[1] = 1;
            inv[1] = 1;
            for(long i = 2;i < max;i++)
            {
                fac[i] = i * fac[i - 1] % mod;
                inv[i] = mod - inv[mod % i] * (mod / i) % mod;
                finv[i] = finv[i - 1] * inv[i] % mod;
            }
        }

        //二項計算
        public long com(long n,long k)
        {
            if (n < 0 || k < 0)
                return 0;
            if (n < k)
                return 0;
            return fac[n] * (finv[n - k] * finv[k] % mod) % mod;
        }

    }
    
}