给出 nn 个互不相同的正整数。
问存在多少个子集,使得子集中所有数的异或和是质数。
由于答案可能很大,请你输出对 109+7109+7 取模后的结果。

输入格式

第一行包含整数 nn。
第二行包含 nn 个正整数。

输出格式

输出一个整数,表示满足条件的子集数量对 109+7109+7 取模后的结果。

数据范围

1≤n≤50001≤n≤5000,
1≤1≤ 给定正整数 ≤5000≤5000。

输入样例:

3 1 2 3

输出样例:

4
image.png


  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 5010, M = 8192, mod = 1e9 + 7;
  6. int a[N];
  7. int f[N][M];
  8. int n;
  9. bool is_prime(int x) // 判定质数
  10. {
  11. if (x < 2) return false;
  12. for (int i = 2; i <= x / i; i ++ )
  13. if (x % i == 0)
  14. return false;
  15. return true;
  16. }
  17. int main() {
  18. cin >> n;
  19. for (int i = 1; i <= n; ++i) cin >> a[i];
  20. //f[i][j] 表示只考虑前i个数,异或结果是j的集合
  21. //f[i][j] = f[i-1][j] + f[i-1][j ^ a[i]];
  22. f[0][0] = 1;
  23. for (int i = 1; i <= n; ++i)
  24. for (int j = 0; j <= M; ++j) {
  25. f[i][j] = f[i-1][j];
  26. //异或值小于mod再加
  27. if ((a[i] ^ j) < M) f[i][j] = (f[i][j] + f[i-1][a[i] ^ j]) % mod;
  28. }
  29. int res = 0;
  30. for (int i = 2; i < M; ++i) {
  31. if (is_prime(i)) res = (res + f[n][i]) % mod;
  32. }
  33. cout << res << endl;
  34. return 0;
  35. }

滚动数组优化

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 5010, M = 8192, mod = 1e9 + 7;
  6. int a[N];
  7. int f[2][M];
  8. int n;
  9. bool is_prime(int x) // 判定质数
  10. {
  11. if (x < 2) return false;
  12. for (int i = 2; i <= x / i; i ++ )
  13. if (x % i == 0)
  14. return false;
  15. return true;
  16. }
  17. int main() {
  18. cin >> n;
  19. for (int i = 1; i <= n; ++i) cin >> a[i];
  20. //f[i][j] 表示只考虑前i个数,异或结果是j的集合
  21. //f[i][j] = f[i-1][j] + f[i-1][j ^ a[i]];
  22. f[0][0] = 1;
  23. for (int i = 1; i <= n; ++i)
  24. for (int j = 0; j < M; ++j) {
  25. f[i & 1][j] = f[i - 1 & 1][j] % mod;
  26. //异或值小于mod再加
  27. if ((j ^ a[i]) < M) f[i & 1][j] = (f[i & 1][j] + f[i - 1 & 1][j ^ a[i]]) % mod;
  28. }
  29. int res = 0;
  30. for (int i = 2; i < M; ++i) {
  31. if (is_prime(i)) res = (res + f[n & 1][i]) % mod;
  32. }
  33. cout << res << endl;
  34. return 0;
  35. }