AcWing 890. 能被整除的数-代码注释-golang
原题链接
简单
作者:
望哥
,
2020-07-18 16:24:08
,
所有人可见
,
阅读 661
package main
import "fmt"
import "bufio"
import "os"
var reader=bufio.NewReader(os.Stdin)
var writer=bufio.NewWriter(os.Stdout)
const M=20
var p [M]int
func main(){
var n,m int
fmt.Fscan(reader, &n,&m)
for i:=0;i<m;i++{
fmt.Fscan(reader, &p[i])
}
// 给定一个整数n和m个不同的质数p1,p2,…,pm。
// 请你求出1~n中能被p1,p2,…,pm中的至少一个数整除的整数有多少个。
// 容斥原理
// 总数
res:=0
// 遍历 1~2^m, 至少选中一个质数
for i:=1;i<1<<m;i++{
t:=1 // 选中质数乘积
cnt:=0 // 选中质数个数,二进制1的个数
for j:=0;j<m;j++{
// 第j位是否为1,即是否选中第j个质数
if i>>j & 1 > 0{
// 乘积大于n了则不考虑
if t*p[j] > n {
t=-1
break
}
// t=p[k1]*p[k2]*...*p[kx] 所有选中质数乘积
t*=p[j]
cnt++
}
}
if t!=-1{
if cnt%2 == 0 {
// 容斥原理, 偶数个并集要减掉
// n/t 表示有能被t整除的数的个数
res -= n/t
}else{
res += n/t
}
}
}
fmt.Println(res)
}