using System; using System.Collections; using System.Collections.Generic; using System.Linq; /* 2018までの素数は2~2017まで306個あって、小さいものから累計してゆくと 33個で1988、34個で2127になるので、最大で33個の組み合わせまでが想定される */ class Program { static void Main(string[] args) { new Program().boot(); } public void boot() { BitArray sieve = new BitArray(2018 + 1, true); for (int i = 2; i <= Math.Sqrt(2018); i++) { int j = i + i; while (j <= 2018) { sieve[j] = false; j += i; } } List<int> list = new List<int>(); for (int i = 2; i <= 2018; i++) { if (sieve[i]) { list.Add(i); } } //Console.WriteLine(string.Join(",", list)); //Console.WriteLine(list.Count); int level = 33; foreach (var item in list) { loop(list, item, level - 1); } } Stack<int> items = new Stack<int>(); bool loop(IEnumerable<int> list, int item, int level) { bool flag = false; items.Push(item); if (level == 1) { int last = 2018 - items.Sum(); if (last <= 2 || items.First() >= last) { flag = true; } else if (list.Contains(last)) { items.Push(last); Console.WriteLine(items.Count() + "|" + string.Join(",", items.Reverse())); items.Pop(); } } else { IEnumerable<int> list2 = list.Where(x => item < x); foreach (var item2 in list2) { if (loop(list2, item2, level - 1)) { break; } } } items.Pop(); return flag; } }
Standard input is empty
33|2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,167 33|2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,131,137,157 33|2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,137,139,149 33|2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,113,127,131,137,139