1
0

CodeForces-1097F.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include <bitset>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6. int main() {
  7. ios::sync_with_stdio(false);
  8. cin.tie(nullptr);
  9. constexpr int max_value = 7000;
  10. int n, q; cin >> n >> q;
  11. vector<int> mu(max_value + 1), primes;
  12. vector<bool> composite(max_value + 1);
  13. mu[1] = 1;
  14. for (int i = 2; i <= max_value; ++i) {
  15. if (!composite[i]) primes.push_back(i), mu[i] = -1;
  16. for (int p : primes) {
  17. if (i * p > max_value) break;
  18. composite[i * p] = true;
  19. if (i % p == 0) { mu[i * p] = 0; break; }
  20. mu[i * p] = -mu[i];
  21. }
  22. }
  23. vector<bitset<max_value + 1>> inverse_mask(max_value + 1);
  24. for (int v = 1; v <= max_value; ++v) {
  25. for (int k = 1; v * k <= max_value; ++k) {
  26. if (mu[k] != 0) inverse_mask[v].set(v * k);
  27. }
  28. }
  29. vector<bitset<max_value + 1>> state(n + 1);
  30. string output;
  31. while (q--) {
  32. int type, x; cin >> type >> x;
  33. if (type == 1) {
  34. int v; cin >> v; state[x].reset();
  35. for (int d = 1; d * d <= v; ++d) if (v % d == 0) {
  36. state[x].set(d); state[x].set(v / d);
  37. }
  38. } else if (type == 2) {
  39. int y, z; cin >> y >> z; state[x] = state[y] ^ state[z];
  40. } else if (type == 3) {
  41. int y, z; cin >> y >> z; state[x] = state[y] & state[z];
  42. } else {
  43. int v; cin >> v;
  44. output.push_back(char('0' + ((state[x] & inverse_mask[v]).count() & 1U)));
  45. }
  46. }
  47. cout << output << '\n';
  48. }