能被整除的数

能被整除的数

题意

给定$n$和$m$个不同的质数,$p_{1}, p_{2}, \dots, p_{m}$问$n$能被$p_{1}, p_{2}, \dots, p_{m}$中至少$1$个数整除的个数是多少

$\begin{array}{l}1 \leq m \leq 16 \\ 1 \leq n, p_{i} \leq 10^{9}\end{array}$

题解

二进制枚举所有数是否选取,即枚举交集。

这m个都是质数所以都互质,能被整除两个数就是能整除他们的$lcm$即乘积。

对于任意的质数$p$,$n$中包含能被$p$整除的数的个数为$\left\lfloor\frac{n}{P}\right\rfloor$

复杂度$\\ O\left(2^{m} \times m\right)$

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 int main(){
 5     int n,m;
 6     cin>>n>>m;
 7     vector<int>prime(m);
 8     for(int i=0;i<m;i++)
 9         cin>>prime[i];
10     int res=0;
11     for(int i=1;i<1<<m;i++){
12         int t=1,cnt=0;
13         for(int j=0;j<m;j++)
14             if(i>>j & 1){
15                 cnt++;
16                 if((ll)t*prime[j]>n){
17                     t=-1;
18                     break;
19                 }
20                 t*=prime[j];
21             }
22         if(t!=-1){
23             if(cnt&1) res+=n/t;
24             else res-=n/t;
25         }
26     }
27     cout<<res<<endl;
28 }

猜你喜欢

转载自www.cnblogs.com/hhyx/p/12770947.html