容斥原理可以看看这篇
http://blog.csdn.net/yangdelu855/article/details/76832254
突然发现了个好玩的东西
枚举子集
找出0-9的所有子集
#include<stdio.h>
int main()
{
int n=10;
for(int i=0; i<(1<<n); i++)
{
for(int j=0; j<n; j++)
if(i&(1<<j))
printf("%d",j);
printf("\n");
}
return 0;
}
这道题需要把所有数的子集的乘积找出来
所以用的这个枚举子集
#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
ll m[16];
ll gcd(ll n, ll m)
{
if(m==0)
return n;
else
return gcd(m,n%m);
}
ll lcm(ll n,ll m)
{
return m/gcd(n,m)*n;
}
int main()
{
ll n;
int t;
while(cin>>n)
{
ll ans=0;
scanf("%d",&t);
for(int i=0; i<t; i++)
{
scanf("%lld",&m[i]);
}
ll cj=1;
for(int i=1; i<(1<<t); i++)
{
cj=1;int c=0;
for(int j=0; j<t; j++)
{
if(i&(1<<j))
{
c++;
cj=lcm(cj,m[j]);
}
}
if(c%2==0)
ans-=n/cj;
else
ans+=n/cj;
}
cout<<n-ans<<endl;
}
return 0;
}