牛客小白月赛5 A 无关 (容斥)

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

思路:先找出含有这些质数因子的数的个数,然后再减去。记住:会爆因子乘积long long 

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100];
int main()
{
    ll l,r;
    int k;
    while(~scanf("%lld%lld%d",&l,&r,&k))
    {
        for(int i=1;i<=k;i++)
        {
            scanf("%lld",&a[i]);
        }
 
        ll ans=0;
        ll sum;
        for(ll i=1;i<(1<<k);i++)
        {
            int flag=1;
            //cout<<i<<' ';
            ll x=i;
            ll cs=1;
            int js=1;
            int ss=0;
            while(x)
            {
                if(x&1)
                cs*=a[js],ss++;
                if(cs>r)
                {
                    flag=0;
                    break;
                }
                x>>=1;
                js++;
            }
            //cout<<endl;
            if(!flag)continue;
            ll z=r-r%cs;
            if(z<l)
            {
                continue;
            }
            else
            {
                z=z-l+1;
                if(z%cs==0)
                {
                    sum=z/cs;
                }
                else
                {
                    sum=z/cs+1;
                }
            }
            if(ss%2==0)ans-=sum;
            else ans+=sum;
        }
        printf("%lld\n",r-l+1-ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/imzxww/article/details/81194616