usaco

Clean implementations of solutions to USACO problems

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int sieve_size;
bitset<10000001> bs;
vector<int> pr;

void sieve(int size) {
	sieve_size = size;
	bs.set(); bs[0] = bs[1] = 0;
  	for (ll i = 2; i <= sieve_size; ++i) if (bs[i]) {
		for (ll j = i * i; j <= sieve_size; j += i) bs[j] = 0;
		pr.push_back(i);
	}
}

int DP[10001] = { 1 };

int main() {
	ifstream cin("exercise.in");
	ofstream cout("exercise.out");

	int N, M;
	cin >> N >> M;
	sieve(N);
	for (auto& p : pr) {
		for (int i = N; i >= 0; --i) {
			for (int j = p; j <= N - i; j *= p) DP[i + j] = ((ll)j * DP[i] + DP[i + j]) % M;
		}
	}
	int ans = 0;
	for (int i = 0; i <= N; ++i) ans = (DP[i] + ans) % M;
	cout << ans << '\n';
}