题意:给定一个N,然后给定M个数,问1-(N-1)中有多少个数是这M个数的倍数。
题解:注意4和6需要容斥12,那么就可以归纳出这M个数虽然不是素数,但只需在奇加偶减的时候容斥它们的lcm即可。
Status | Accepted |
---|---|
Time | 1201ms |
Memory | 1748kB |
Length | 1314 |
Lang | C++ |
Submitted | 2018-09-16 10:53:15 |
Shared | |
RemoteRunId | 26287862 |
Select Code
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <bitset>
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const double eps=1e-7;
typedef long long ll;
#define vi vector<int>
#define si set<int>
#define pii pair<int,int>
#define pi acos(-1.0)
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
ll n,m,num,a[15];
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b)
{
return a/gcd(a,b)*b;
}
ll func(ll up,ll m)
{
ll ans=0,tmp,flag;
rep(i,1,(1<<m)-1)
{
tmp=1,flag=0;
rep(j,0,m-1)
{
if(i&(1<<j))
{
++flag;
tmp=lcm(tmp,a[j]);
}
}
if(flag&1)ans+=up/tmp;
else ans-=up/tmp;
}
return ans;
}
void init()
{
num=0;
mem(a,0);
}
int main()
{
while(~scanf("%lld%lld",&n,&m))
{
init();
rep(i,0,m-1)
{
ll x;
scll(x);
if(x)a[num++]=x;//第二处细节 不包含0
}
printf("%lld\n",func(n-1,num));//第一处细节 不包括n
}
}