二进制枚举及容斥
2015-08-03 15:57
417 查看
输入n(<10^9),m(<=15) 接下来输入m个数(皆下于100)
求从1到n中不是这m个数的倍数的数的个数。
#include <iostream>
using namespace std;
typedef long long LL;
LL a[15];
LL gcd(LL a,LL b) //求a和b的最大公约数
{
if(b) return gcd(b,a%b);
return a;
}
LL lcm(LL a,LL b) //求a和b的最小公倍数
{
return a/gcd(a,b)*b;
}
int main()
{
LL n,ans,l;
int i,j,m,flag;
while(cin>>n>>m)
{
ans=0;
for(i=0;i<m;i++)
cin>>a[i];
for(i=1;i<(1<<m);i++) //利用2进制枚举出m个数的2^m-1种组合情况(减的1为都不取,即约数1的情况)
{
l=1;flag=0;
for(j=0;j<m;j++) //对i的2进制从第1位到第m位判读
{
if((1<<j)&i) //判断2进制i的第j位是否为1,即是否取了a[j]
{
l=lcm(a[j],l);
if(l>n) break;
flag++;
}
}
if(flag&1) ans+=n/l;
else ans-=n/l;
}
cout<<n-ans<<endl;
}
return 0;
}
求从1到n中不是这m个数的倍数的数的个数。
#include <iostream>
using namespace std;
typedef long long LL;
LL a[15];
LL gcd(LL a,LL b) //求a和b的最大公约数
{
if(b) return gcd(b,a%b);
return a;
}
LL lcm(LL a,LL b) //求a和b的最小公倍数
{
return a/gcd(a,b)*b;
}
int main()
{
LL n,ans,l;
int i,j,m,flag;
while(cin>>n>>m)
{
ans=0;
for(i=0;i<m;i++)
cin>>a[i];
for(i=1;i<(1<<m);i++) //利用2进制枚举出m个数的2^m-1种组合情况(减的1为都不取,即约数1的情况)
{
l=1;flag=0;
for(j=0;j<m;j++) //对i的2进制从第1位到第m位判读
{
if((1<<j)&i) //判断2进制i的第j位是否为1,即是否取了a[j]
{
l=lcm(a[j],l);
if(l>n) break;
flag++;
}
}
if(flag&1) ans+=n/l;
else ans-=n/l;
}
cout<<n-ans<<endl;
}
return 0;
}
相关文章推荐
- 【Objective-C编程】 Must explicitly describe intended ownership of an object array parameter异常报错解决方案
- Linux 基础篇 --- 添加新的虚拟硬盘
- 广告公司薪水一览,看看你达到哪个级别?
- ios UIWebView 加载本地html,js,css文件的问题
- php导出Excel文件简单的方法(非PHPEXCEL)
- 南阳oj 小猴子下落 题目63
- 基于struts 的FormFile实现文件的上传功能
- Hadoop入门进阶课程9--Mahout介绍、安装与应用案例
- C格式字符串转为二叉树
- Leetcode-102(Java) Binary Tree Level Order Traversal
- Selenium2学习-028-WebUI自动化实战实例-026-获取页面元素值或者元素属性值
- Memblaze发布PBlaze 4系列PCIe SSD新品 全面拥抱 NVMe
- UVA 537 Artificial Intelligence?
- markdown语法学习
- C#高级编程六十七天----LINQ提供程序
- 文字反排unicode-bidi、direction
- java动态代理详解
- Hadoop入门进阶课程8--Hive介绍和安装部署
- Android学习中ADT创建工程后出现appcompat_V7包和自定义包异常处理方法(文章转移)
- json.stingIfy()和json.parse()区别