【容斥】牛客小白月赛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;
}

猜你喜欢

转载自blog.csdn.net/qq_41037114/article/details/83061684