#include #include #include #include #include #include #include using namespace std; #define intt long long int #define MOD 1000000007 int n, K; bool primes[10000]; int dyn[10001][10001]; void erathosten() { memset(primes, 1, sizeof(primes)); primes[0] = primes[1] = 0; for (int i = 2; i*i < 10000; ++i) { if (!primes[i]) continue; for (int j = i*i; j < 10000; j += i) { primes[j] = false; } } } void iter() { for (int k = 0; k <= K; k++) dyn[0][k] = 1; for (int i = 2; i <= n; i++) { if (!primes[i]) { } dyn[i][0] = dyn[i][1] = 0; for (int j = 2; j <= K; j++) { if (primes[j] && i >= j) { int x; if (i - j < 0) { x = 0; } else x = dyn[i - j][j]; int y = dyn[i][j - 1]; dyn[i][j] = (x + y) % MOD; } else dyn[i][j] = dyn[i][j - 1]; } } } int f(int n, int k) { if (n == 0) return 1; if (n < 2 || k < 2) return 0; int& res = dyn[n][k]; if (res != -1) return res; int closestPrime = k; while (closestPrime >= 0 && !primes[closestPrime]) closestPrime--; int x = f(n - closestPrime, closestPrime); int y = f(n, closestPrime - 1); res = x + y; res %= MOD; return res; } int main() { ifstream in("scourge.in"); ofstream out("scourge.out"); in >> n >> K; erathosten(); iter(); out << dyn[n][K] << endl; return 0; }