Exemple #1
0
        static void Main(string[] args)
        {
            LongInteger k = new LongInteger(Console.ReadLine());
            LongInteger n = new LongInteger(Console.ReadLine());
            LongInteger s = new LongInteger("0");

            s = s.Minus(s.PowInteger(k, n), new LongInteger("1")); // k^(n)-1. Возведение в степень - быстрое, если что.
            k = s.Minus(k, new LongInteger("1"));                  // k-1.
            s = s.Divided(s, k);                                   // s/k.
            Console.WriteLine(s.x);
            Console.ReadLine();
        }
        public LongInteger PowInteger(LongInteger a, LongInteger k)
        {
            LongInteger    b   = new LongInteger("1");
            HashSet <char> hsh = new HashSet <char>();

            foreach (char i in "02468")
            {
                hsh.Add(i);
            }
            while (a.StringComparer(k.x, "0"))
            {
                if (hsh.Contains(k.x[k.x.Length - 1]))
                {
                    k = k.Divided(k, new LongInteger("2"));
                    a = a.ComplexMultiplied(a, a);
                }
                else
                {
                    k = k.Minus(k, new LongInteger("1"));
                    b = b.ComplexMultiplied(b, a);
                }
            }
            return(b);
        }
        public LongInteger Divided(LongInteger a, LongInteger b, bool reverse = false)//????????)
        {
            // деление без остатка.
            if (b.x == "1")
            {
                return(a);
            }
            if (reverse)
            {
                a = a.Reverse();
                b = b.Reverse();
            }
            string c = "", n = "", r = "";
            int    z, k = 0, x = 1;
            int    y = 0, y1 = 0;

            while (a.x.Length > k)
            {
                //y1 = 0;
                n += Convert.ToString(a.x[k]);
                k++;
                while (a.StringComparer(b.x, n) && (k < a.x.Length))
                {
                    n += Convert.ToString(a.x[k]);
                    if ((y != 0))
                    {
                        c += "0";
                    }
                    k++;
                }
                x = 1;
                while (a.StringComparer(n, b.ComplexMultiplied(b, new LongInteger(Convert.ToString(x))).x, true))
                {
                    x++;
                }
                x--;
                n = Convert.ToString(a.Minus(new LongInteger(n), new LongInteger(Convert.ToString(int.Parse(b.x) * x))).x);
                z = 0;
                while ((n[z] == '0') && (k < n.Length))
                {
                    z++;
                }
                if (z != 0)
                {
                    n = n.Substring(z);
                }
                if (n[0] == '0')
                {
                    n = n.Remove(0, 1);
                }
                c += Convert.ToString(x);
                y++;
            }

            if (reverse)
            {
                return(new LongInteger(c).Reverse());
            }
            else
            {
                return(new LongInteger(c));
            }
        }