问题描述
给出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