public static long CountCombination(int seedsCount, int length, long maxVal, out bool outOfMaxVal) { outOfMaxVal = false; FactorsGenerator fg = new FactorsGenerator(); List <long> pn = new List <long>(); for (int a = 1; a <= seedsCount; a++) { pn.AddRange(fg.GeneratorFactors(a)); } List <long> pm = new List <long>(); for (int a = 1; a <= length; a++) { pm.AddRange(fg.GeneratorFactors(a)); } for (int a = 1; a <= seedsCount - length; a++) { pm.AddRange(fg.GeneratorFactors(a)); } List <long> pm2 = new List <long>(); foreach (long a in pm) { if (pn.Contains(a)) { pn.Remove(a); continue; } pm2.Add(a); } long result = 1; int j = 0; foreach (long a in pn) { result *= a; if (result >= maxVal) { outOfMaxVal = true; if (j < pm2.Count) { result /= pm2[j]; j++; } if (j >= pm2.Count) { break; } } } for (; j < pm2.Count; j++) { result /= pm2[j]; } return(result); }
public static long GCD(long numa, long numb) { FactorsGenerator fg = new FactorsGenerator(); List <long> fa = fg.GeneratorFactors(numa); List <long> fb = fg.GeneratorFactors(numb); int ai = 0, bi = 0; List <long> crossf = new List <long>(); while (ai < fa.Count && bi < fb.Count) { long a = fa[ai]; long b = fb[bi]; if (a == b) { crossf.Add(a); ai++; bi++; continue; } if (a < b) { ai++; continue; } if (a > b) { bi++; continue; } } long result = 1; foreach (var c in crossf) { result *= c; } return(result); }
public static long GCD(long numa, long numb) { FactorsGenerator fg = new FactorsGenerator(); List<long> fa = fg.GeneratorFactors(numa); List<long> fb = fg.GeneratorFactors(numb); int ai = 0,bi = 0; List<long> crossf = new List<long>(); while (ai < fa.Count && bi < fb.Count) { long a = fa[ai]; long b = fb[bi]; if (a == b) { crossf.Add(a); ai++; bi++; continue; } if (a < b) { ai++; continue; } if (a > b) { bi++; continue; } } long result = 1; foreach (var c in crossf) { result *= c; } return result; }