【SSLGZ 2776】2017年10月19日提高组 整除(number)(容斥原理)

问题描述
给出n个数a1,a2……an,求区间[L,R]中有多少个整数不能被其中任何一个数整除。
输入
第一行三个正整数,n,L,R。

第二行n个正整数a1,a2……an
输出
一个数,即区间[L,R]中有多少个整数不能被其中任何一个数整除。
样例输入
2 1 1000

10 15
样例输出
867
算法讨论
可以利用容斥原理做,再dfs枚举一下,最后统计时奇加偶减(然而下面这个做法不知道发生了什么要偶加奇减←_←)。

#include <cstdio>
using namespace std;
#define maxn 20
int a[maxn];
int n,l,r;
long long ans;

long long gcd(long long x,long long y)
{
    if (y==0)
        return x;
    else
        return gcd(y,x % y);
}

long long lcm(long long x,long long y)
{
     return (long long)(x*y)/(long long)gcd(x,y);
}

int dfs(int dep,int s,long long b)
{
    if (dep>n)
    {
        if (s % 2==1)
            ans-=(long long)r/b-(long long)(l-1)/b;
        else 
            ans+=(long long)r/b-(long long)(l-1)/b;
        return 0;
    }
    dfs(dep+1,s+1,lcm(b,a[dep])); 
    dfs(dep+1,s,b);
}

int main()
{
    freopen("number.in","r",stdin);
    freopen("number.out","w",stdout);
    scanf("%d%d%d",&n,&l,&r);
    for (int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    dfs(1,0,1);
    printf("%lld",ans);
    fclose(stdin); fclose(stdout);
}

这里写图片描述
Pixiv ID:62919106

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值