码迷,mamicode.com
首页 > 其他好文 > 详细

能被整除的数

时间:2020-04-25 00:47:12      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:div   rac   nbsp   res   进制   bsp   out   begin   lcm   

能被整除的数

题意

给定$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 }

 

能被整除的数

标签:div   rac   nbsp   res   进制   bsp   out   begin   lcm   

原文地址:https://www.cnblogs.com/hhyx/p/12770947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!