1. 程式人生 > >【容斥】牛客小白月賽5——A

【容斥】牛客小白月賽5——A

無關(relationship)

https://www.nowcoder.com/acm/contest/135/A

題目描述

  若一個集合A內所有的元素都不是正整數N的因數,則稱N與集合A無關。

  給出一個含有k個元素的集合A={a1,a2,a3,...,ak},求區間[L,R]內與A無關的正整數的個數。

  保證A內的元素都是素數

輸入描述:

輸入資料共兩行:

第一行三個正整數L,R,k,意義如“題目描述”。

第二行k個正整數,描述集合A,保證k個正整數兩兩不相同。

輸出描述:

輸出資料共一行:

第一行一個正整數表示區間[L,R]內與集合A無關的正整數的個數

示例1

輸入

1 10 4
2 3 5 7

輸出

1

輸入

2 10 4
2 3 5 7

輸出

0

說明

對於30%的資料:1<=L<=R<=10^6

對於100%的資料:1<=L<=R<=10^18,1<=k<=20,2<=ai<=100

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[22];
ll check(ll l, ll r, ll x)
{
    return r/x-(l-1)/x;
}
int main()
{
    ll l,r;int k;
    scanf("%lld%lld%d",&l,&r,&k);
    for(int i=0;i<k;i++) scanf("%lld",&a[i]);
    ll ans=0;
    for(int s=0;s<(1<<k);s++)
    {
        ll c=1,cnt=0;
        int flag=0;
        for(int j=0;j<k;j++)
        {
             if(s>>j&1)
             {
                 if(c*a[j]<c) flag=1;
                 c*=a[j],cnt++;
             }
        }
        if(flag) continue;
        if(cnt%2) ans-=check(l,r,c);
        else ans+=check(l,r,c);
    }
    printf("%lld\n",ans);
    return 0;
}