Advertisement
_no0B

Untitled

Nov 7th, 2021
793
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define MAX ((int)1e9 + 5)
  3. #define N ((int)1e6 + 5)
  4. #define fastio ios_base::sync_with_stdio(false),cin.tie(NULL)
  5. using namespace std;
  6.  
  7. int status[1 + (N/32)] , primeCount[N];
  8.  
  9. vector < int > bitwiseSieve(int n)
  10. {
  11.     vector < int > prime;
  12.     for(int i = 3 ; i * i <= n ; i += 2){
  13.         int idx = i >> 5 , bit = i & 31;
  14.         if((status[idx] & (1<<bit)) != 0) continue;
  15.         for(int j = i*i ; j <= n ; j += (i<<1)){
  16.             int idx = j >> 5 , bit = j & 31;
  17.             status[idx] |= 1<<bit;
  18.         }
  19.     }
  20.  
  21.     prime.push_back(2);
  22.     for(int i = 3 ; i <= n ; i += 2){
  23.         int idx = i >> 5 , bit = i & 31;
  24.         if((status[idx] & (1<<bit)) == 0) prime.push_back(i);
  25.     }
  26.     return prime;
  27. }
  28.  
  29. int solve(int n , vector < int >& prime){
  30.     int total = prime.size() , ans = n;
  31.     for(int mask = 1 ; mask < (1<<total) ; mask++){
  32.         int pro = 1;
  33.         for(int i = 0 ; i < total ; i++){
  34.             if(mask & (1<<i)){
  35.                 pro *= prime[i];
  36.                 if(pro > n) break;
  37.             }
  38.         }
  39.         int numberOfMultiple = n / pro;
  40.         if(__builtin_popcount(mask) % 2 == 1) ans -= numberOfMultiple;
  41.         else ans += numberOfMultiple;
  42.     }
  43.     ans = ans - (primeCount[n] - total);
  44.     if(n >= 1) ans--;
  45.     return ans;
  46. }
  47.  
  48. int main()
  49. {
  50.     /// problem: https://www.spoj.com/problems/KPRIMESB/
  51.     fastio;
  52.     int t , caseNo = 1;
  53.     cin>>t;
  54.     bitwiseSieve(1e6);
  55.     primeCount[0] = primeCount[1] = 0;
  56.     primeCount[2] = 1;
  57.     for(int i = 3 ; i < N ; i++){
  58.         int idx = i >> 5 , bit = i & 31;
  59.         primeCount[i] = primeCount[i-1];
  60.         if((i&1) && (status[idx] & (1<<bit)) == 0) primeCount[i]++;
  61.     }
  62.     while(t--){
  63.         int n , k;
  64.         cin>>n>>k;
  65.         vector < int > prime(k);
  66.         for(int i = 0 ; i < k ; i++) cin>>prime[i];
  67.         sort(prime.begin() , prime.end());
  68.         while(prime.size() > 0 && prime.back() > n) prime.pop_back();
  69.         cout<<"Case "<<caseNo++<<": "<<solve(n , prime)<<endl;
  70.     }
  71.     return 0;
  72. }
  73.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement