Description
Now you get a number N, and a M-integers set, you should find out how many integers which are small than N, that they can divided exactly by any integers in the set. For example, N=12, and M-integer set is {2,3}, so there is another set {2,3,4,6,8,9,10}, all the integers of the set can be divided exactly by 2 or 3. As a result, you just output the number 7.
Input
There are a lot of cases. For each case, the first line contains two integers N and M. The follow line contains the M integers, and all of them are different from each other. 0
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
__int64 a[30];
int n,m;
//cur表示
__int64 sum=0;
__int64 gcd(__int64 b,__int64 a)
{
return a==0?b:gcd(a,b%a);
//while()
}//最小公倍数
void dfs(int cur,__int64 lcm,int id)//容斥原理公式
{
//lcm=lcm/gcd(lcm,a[cur])*a[cur];
lcm=a[cur]/gcd(a[cur],lcm)*lcm;
if(id&1)//运用了快速幂的方法判断奇偶
sum+=(n-1)/lcm;
else
sum-=(n-1)/lcm;
// cout<<"id = "<<id<<" : "<<sum<<endl;
for(int i=cur+1;i<=m;i++)
dfs(i,lcm,id+1);
}
int main()
{
int t;
while(~scanf("%d%d",&n,&t))
{
int i,x;
m=0;
for(i=1;i<=t;i++)
{
scanf("%d",&x);
if(x)
{
a[++m]=x;
}
}
sum=0;
for(i=1;i<=m;i++)
dfs(i,a[i],1);
printf("%I64d\n",sum);//容斥原理公式
// cout<<sum<<endl;
}
return 0;
}/*
1000000 18
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1000000 5
15 16 17 18 19
12 2
2 3
12 2
1 0
12 4
2 4 0 6 0
*/