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)); } }