岸原オカルト研究部

プログラミングを勉強していくブログです

ABC60~ABC100 ~C問題用競プロライブラリ

素敵な夜ですね。

ABC60~ABC100を解く中で必要になったメソッドを纏めたクラスを作りました。
C#で競プロを始める皆さん、お使いください!!


使い方

var a = new LittleMethods();
a.hogehoge();


コード

    class LittleMethods
    {
    	//整数二つを受け入れ、最大公約数を出す
        public long GreatestCommonDivisor(long a, long b)
        {
            // https://qiita.com/Jane35416555/items/0d9d6dd088049ce64e3d

            long x = 0;

            while (1 == 1)
            {
                if (a % b == 0)
                {
                    return b;
                }
                else
                {
                    x = a % b;
                    a = b;
                    b = x;
                }

            }

        }

		//整数二つを入れ、最小公倍数を出す
        public long LeastCommonMultipul(long a, long b)
        {
            // https://qiita.com/Jane35416555/items/0d9d6dd088049ce64e3d

            long x = GreatestCommonDivisor(a, b);
            return a * b / x;
        }

		//整数一つを入れ、素数ならtrueを返す
        public bool PrimeNumberOrNot(long x)
        {

            if (x == 1) { return false; }
            for (long i = 2; i * i <= x; i++)
            {
                if (x % i == 0) { return false; }
            }

            return true;
        }

		//整数一つを入れ、全ての約数をListで返す
        public List<long> DivisorAll(long x)
        {
            List<long> y = new List<long>();

            if (x == 1) { y.Add(1); return y; }

            for (long i = 1; i * i <= x; i++)
            {
                if (x % i == 0)
                {
                    y.Add(i);
                    if (x / i != i) { y.Add(x / i); }

                }

            }

            y.Sort();

            return y;

        }

        //https://stackoverflow.com/questions/4124189/
        //sqrtの精度に問題があると聞いたのでいざという時使えるよう調べた。decimalを入れるとルートしてdecimalで返す。
        public decimal SuperSqrt(decimal x,decimal epsilon = 0.0M)
        {
            decimal cur = (decimal)Math.Sqrt((double)x), prev;

            do
            {
                prev = cur;
                if (prev == 0.0M) return 0;
                cur = (prev + x / prev) / 2;

            } while (Math.Abs(prev - cur) > epsilon);

            return cur;


        }
        
        //階乗して返す
        public long Multipul_Fuctrial(long x)
        {
            long a = 1;

            for (int i = 2; i <= x; i++)
            {
                a *= i;
            }

            return a;

        }

		//特定の数で毎回割りながら階乗する。
        public long Multipul_FuctrialRemainderer(long x)
        {
            long a = 1;
            long b = (long)Math.Pow(10, 9) + 7 //ここは問題に寄る

            for (int i = 2; i <= x; i++)
            {
                a *= i;
                a = a % b;
            }

            return a;

        }
        
        //順列総当り用 戻り値:1 2 3,1 3 2,などなど各順列のリストのリスト
        //本番中に作ったので参考URLを紛失。申し訳ございません。
        public static IEnumerable<T[]> Make_PermutationList<T>(IEnumerable<T> col)
    	{

	        if (col.Count() == 1) yield return new T[] { col.First() };

    	    foreach(var x in col)
        	{
            	var selected = new T[] { x };
            	var unused = col.Except(selected);

            foreach (var y in Make_PermutationList(unused))
            {
                yield return selected.Concat(y).ToArray();
            }
        }

        
    }




現在岸原オカルト研究部では、黒魔術(C#、競プロ)を研究しています。
twitter:@kisihara_c

他の黒魔術研究↓
自分用 C#のLINQ周り全部書く - 岸原オカルト研究部
超インスタント競プロ環境構築 C# - 岸原オカルト研究部