fork download
  1. /*
  2. * Author: Geeza
  3. */
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. #define ld long double
  8. #define ll long long
  9. #define pb push_back
  10. #define fin(a, n) for(int i = a; i < n; i++)
  11. #define fjn(a, n) for(int j = a; j < n; j++)
  12. #define all(a) a.begin(),a.end()
  13. #define allr(a) a.rbegin(),a.rend()
  14. #define FAST ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
  15.  
  16. using namespace std;
  17.  
  18. const double PI = acos(-1);
  19. const int N = 1e5+5;
  20. const ll oo = 0x3f3f3f3f3f3f3f3f;
  21. const int mod = 1000000007, inf = 1e6;
  22.  
  23. string di[] = {"D","L", "U", "R", "UL", "UR", "DL", "DR"};
  24. int dx[] = {+1, +0, +0, -1, -1, -1, +1, +1};
  25. int dy[] = {+0, -1, +1, +0, -1, +1, -1, +1};
  26. char dc[] = {'D', 'L', 'R', 'U'};
  27.  
  28. ll n;
  29. vector<ll> v;
  30. vector<int> idx, frequency;
  31. int dp[71][1<<19];
  32. vector<pair<int, int>> freq[71];
  33. ll spf[72];
  34.  
  35. void precompute() {
  36. for (int i = 0; i < 72; i++) spf[i] = i;
  37. for (ll i = 2; i < 72; i++) {
  38. if (spf[i] == i) {
  39. for (ll j = i*i; j < 72; j+=i) spf[j] = i;
  40. }
  41. }
  42. }
  43.  
  44. ll mul(ll a, ll b) {
  45. return (a%mod * b%mod)%mod;
  46. }
  47.  
  48. ll calc(ll val, ll mask) {
  49. if (val == 71) return mask == 0;
  50.  
  51. int &ret = dp[val][mask];
  52. if (~ret)return ret;
  53. ret = 0;
  54. ll ch1 = 0;
  55. ll ch2 = 0;
  56. if (frequency[val] > 0) {
  57. ll c = 1; // 2^(n-1)
  58. for (int i = 0; i+1 < frequency[val]; i++) {
  59. c *= 2;
  60. if (c >= mod) c -= mod;
  61. }
  62. ll newMask = 0;
  63. for (auto [x, f] : freq[val]) {
  64. if (f&1)newMask ^= (1ll<<idx[x]);
  65. }
  66. c %= mod;
  67. ch1 = calc(val+1, mask)%mod;
  68. ch2 = calc(val+1, mask^newMask)%mod;
  69. ret = (mul(c, ch1) + mul(c, ch2))%mod;
  70. }
  71. else ret = calc(val+1, mask)%mod;
  72.  
  73. return ret;
  74. }
  75.  
  76. void solve() {
  77. cin >> n;
  78. v.assign(n, 0);
  79. idx.assign(70, 0);
  80. frequency.assign(71, 0);
  81. vector<int> primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67};
  82. fin(0, n) cin >> v[i], frequency[v[i]]++;
  83. for (int i = 0, id = 0; i < primes.size(); i++) {
  84. idx[primes[i]] = id++;
  85. }
  86.  
  87. for (int i = 2; i < 71; i++) {
  88. ll tmp = i;
  89. vector<int> f(70, 0);
  90. while (tmp > 1) {
  91. ll p = spf[tmp];
  92. tmp /= p;
  93. f[p]++;
  94. }
  95.  
  96. for (int j = 2; j < 70; j++) {
  97. if (f[j] > 0) {
  98. freq[i].push_back({j, f[j]});
  99. }
  100. }
  101. }
  102.  
  103. memset(dp, -1, sizeof(dp));
  104.  
  105. cout << calc(1, 0)-1 << "\n";
  106. }
  107.  
  108. int main() {
  109. FAST;
  110. #ifndef ONLINE_JUDGE
  111. freopen("input.txt","r",stdin);
  112. freopen("output.txt","w",stdout);
  113. #endif
  114. precompute();
  115. int tt = 1; //cin >> tt;
  116. while(tt--){
  117. solve();
  118. }
  119. return 0;
  120. }
Success #stdin #stdout 0.03s 148916KB
stdin
Standard input is empty
stdout
0