/* ID: espr1t TASK: KEYWORDS: */ #include #include #include #include #include using namespace std; FILE *in; FILE *out; const int MAX = 10004; const int PRM = 1400; const int MOD = 1000000007; int n, k; int dyn[MAX][PRM]; vector primes; bool isPrime(int num) { if (num < 2) return 0; for (int i = 2; i * i <= num; i++) if (num % i == 0) return 0; return 1; } int recurse(int rem, int last) { if (rem == 0) return 1; if (last >= (int)primes.size()) return 0; if (dyn[rem][last] != -1) return dyn[rem][last]; int ans = recurse(rem, last + 1); if (primes[last] <= rem) { ans += recurse(rem - primes[last], last); if (ans >= MOD) ans -= MOD; } return dyn[rem][last] = ans; } int main(void) { in = stdin; out = stdout; in = fopen("scourge.in", "rt"); out = fopen("scourge.out", "wt"); fscanf(in, "%d %d", &n, &k); for (int i = 2; i < k; i++) if (isPrime(i)) primes.push_back(i); memset(dyn, -1, sizeof(dyn)); fprintf(out, "%d\n", recurse(n, 0)); return 0; }