#include #include #include #include using namespace std; //#define DEBUG_OUTPUT const size_t MAX_SIZE = 10001; const size_t MODULE = 1000000007; int n, k; bool sieve[MAX_SIZE]; vector pn; unsigned table[MAX_SIZE][MAX_SIZE]; void readInput() { ifstream finp("scourge.in"); finp >> n >> k; } void calcSieve() { sieve[0] = true; sieve[1] = true; for (int i = 2; i < k; ++i) for (int j = i + i; j < k; j += i) sieve[j] = true; for (int i = 0; i < k; ++i) if (!sieve[i]) pn.push_back(i); #ifdef DEBUG_OUTPUT cout << "Prime numbers: " << endl; for (size_t i = 0; i < pn.size(); ++i) cout << pn[i] << " "; cout << endl << endl; #endif } unsigned solve() { for (int i = 0; i <= pn.size(); ++i) table[0][i] = 1; for (int i = 1; i <= n; ++i) for (int j = 0; j < pn.size(); ++j) { unsigned x = (i - pn[j] >= 0) ? table[i - pn[j]][j] : 0; unsigned y = (j >= 1) ? table[i][j - 1] : 0; table[i][j] = (x + y) % MODULE; } #ifdef DEBUG_OUTPUT for (int i = 0; i < n; ++i) { for (int j = 0; j < pn.size(); ++j) cout << table[i][j] << " "; cout << endl; } cout << endl; #endif return table[n][pn.size() - 1]; } void writeOutput(unsigned result) { ofstream fout("scourge.out"); fout << result << endl; #ifdef DEBUG_OUTPUT cout << result << endl; #endif } int main() { readInput(); calcSieve(); auto result = solve(); writeOutput(result); return 0; }