#include #include #include bool is_prime(int n, std::vector primes) { for (int i = 0; i < primes.size(); i++) { if (n % primes[i] == 0) return false; } return true; } void prime_list(int n, std::vector &primes) { if (n == 1) return; primes.push_back(2); for (int i = 3; i <= n; i += 2) { if (is_prime(i, primes)) { primes.push_back(i); } } } int main() { int m, n; // dp[i] = i円で購入できるカップ麺の最大個数 int dp[10000 + 1] = { 0 }; std::cin >> m >> n; std::vector value(n); for (int i = 0; i < n; i++) { std::cin >> value[i]; dp[value[i]] = 1; } for (int i = 0; i < n; i++) { for (int j = 0; j <= m; j++) { if (dp[j] > 0 && j + value[i] <= m) { dp[j + value[i]] = std::max(dp[j] + 1, dp[j + value[i]]); } } } std::vector primes; prime_list(m, primes); long long ans = 0; for (int i = 0; i < primes.size(); i++) { // 支払い後がprime円になるためには(m - prime[i])円支払えば良い ans += dp[m - primes[i]]; } // もう金欠チャンスが使えないので買えるだけ買う ans += *std::max_element(dp, dp + m + 1); std::cout << ans << std::endl; return 0; }