import java.util.*;
import java.util.Map.Entry;
//mevius.5ch.net/test/read.cgi/tech/1480579110/993
class Q9_993
{
public static void main
(String[] args
) {
solve(2018);
}
static void solve(int n)
{
Counter[] cs = new Counter[n + 1];
cs[0] = new Counter(true);
for (int i = 1; i < cs.length; i++)
cs[i] = new Counter(false);
cs[2].add(cs[0]);
for (int i = 3; i <= n; i += 2)
{
if (!isPrime(i)) continue;
for (int j = n - i; j >= 0; j--)
{
cs[j + i].add(cs[j]);
}
}
Entry
<Integer, Long
>[] result
= cs
[n
].
map.
entrySet().
toArray(new Entry
[0]);
Entry
<Integer, Long
> max
= result
[result.
length - 1]; System.
out.
printf("最大は %d: %d%n%n", max.
getKey(), max.
getValue());
for (Entry
<Integer, Long
> e
: result
) }
static boolean isPrime(int p)
{
if (p < 2) return false;
if ((p & 1) == 0) return p == 2;
int s
= (int) Math.
sqrt(p
); for (int i = 3; i <= s; i += 2)
if (p % i == 0) return false;
return true;
}
static class Counter
{
HashMap
<Integer, Long
> map
= new HashMap
<>();
Counter(boolean start)
{
if (start) map.put(0, 1L);
}
void add(Counter add)
{
for (Map.
Entry<Integer, Long
> entry
: add.
map.
entrySet()) {
map.compute(entry.getKey() + 1, (k, v) -> v == null ? entry.getValue() : v + entry.getValue());
}
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKCi8vbWV2aXVzLjVjaC5uZXQvdGVzdC9yZWFkLmNnaS90ZWNoLzE0ODA1NzkxMTAvOTkzCmNsYXNzIFE5Xzk5Mwp7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQogICAgewogICAgICAgIHNvbHZlKDIwMTgpOwogICAgfQoKICAgIHN0YXRpYyB2b2lkIHNvbHZlKGludCBuKQogICAgewogICAgICAgIGlmIChuIDwgMikgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwoKICAgICAgICBDb3VudGVyW10gY3MgPSBuZXcgQ291bnRlcltuICsgMV07CiAgICAgICAgY3NbMF0gPSBuZXcgQ291bnRlcih0cnVlKTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICBjc1tpXSA9IG5ldyBDb3VudGVyKGZhbHNlKTsKCiAgICAgICAgY3NbMl0uYWRkKGNzWzBdKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDM7IGkgPD0gbjsgaSArPSAyKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCFpc1ByaW1lKGkpKSBjb250aW51ZTsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IG4gLSBpOyBqID49IDA7IGotLSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY3NbaiArIGldLmFkZChjc1tqXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEVudHJ5PEludGVnZXIsIExvbmc+W10gcmVzdWx0ID0gY3Nbbl0ubWFwLmVudHJ5U2V0KCkudG9BcnJheShuZXcgRW50cnlbMF0pOwogICAgICAgIEFycmF5cy5zb3J0KHJlc3VsdCwgQ29tcGFyYXRvci5jb21wYXJpbmdMb25nKEVudHJ5OjpnZXRWYWx1ZSkpOwoKICAgICAgICBFbnRyeTxJbnRlZ2VyLCBMb25nPiBtYXggPSByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCLmnIDlpKfjga8gJWQ6ICVkJW4lbiIsIG1heC5nZXRLZXkoKSwgbWF4LmdldFZhbHVlKCkpOwoKCiAgICAgICAgQXJyYXlzLnNvcnQocmVzdWx0LCBDb21wYXJhdG9yLmNvbXBhcmluZ0ludChFbnRyeTo6Z2V0S2V5KSk7CiAgICAgICAgZm9yIChFbnRyeTxJbnRlZ2VyLCBMb25nPiBlIDogcmVzdWx0KQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7CiAgICB9CgogICAgc3RhdGljIGJvb2xlYW4gaXNQcmltZShpbnQgcCkKICAgIHsKICAgICAgICBpZiAocCA8IDIpIHJldHVybiBmYWxzZTsKICAgICAgICBpZiAoKHAgJiAxKSA9PSAwKSByZXR1cm4gcCA9PSAyOwogICAgICAgIGludCBzID0gKGludCkgTWF0aC5zcXJ0KHApOwogICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDw9IHM7IGkgKz0gMikKICAgICAgICAgICAgaWYgKHAgJSBpID09IDApIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBzdGF0aWMgY2xhc3MgQ291bnRlcgogICAgewogICAgICAgIEhhc2hNYXA8SW50ZWdlciwgTG9uZz4gbWFwID0gbmV3IEhhc2hNYXA8PigpOwoKICAgICAgICBDb3VudGVyKGJvb2xlYW4gc3RhcnQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3RhcnQpIG1hcC5wdXQoMCwgMUwpOwogICAgICAgIH0KCiAgICAgICAgdm9pZCBhZGQoQ291bnRlciBhZGQpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBMb25nPiBlbnRyeSA6IGFkZC5tYXAuZW50cnlTZXQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWFwLmNvbXB1dGUoZW50cnkuZ2V0S2V5KCkgKyAxLCAoaywgdikgLT4gdiA9PSBudWxsID8gZW50cnkuZ2V0VmFsdWUoKSA6IHYgKyBlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQo=