八
【问题描述】
八是个很有趣的数字啊。八=发,八八=爸爸,88=拜拜。当然最有趣的还是8用二进制表示是1000。怎么样,有趣吧。当然题目和这些都没有关系。
某个人很无聊,他想找出[a,b]中能被8整除却不能被其他一些数整除的数。
【输入文件】
输入文件eight.in。第一行一个数n,代表不能被整除的数的个数。第二行n个数,中间用空格隔开。第三行两个数a,b,中间一个空格。
【输出文件】
输出文件eight.out应包含一个整数,为[a,b]间能被8整除却不能被那n个数整数的数的个数。
【样例输入】
3
7764 6082 462
2166 53442
【样例输出】
6378
【数据规模】
对于30%的数据, 1≤n≤5,1≤a≤b≤100000。
对于100%的数据,1≤n≤15,1≤a≤b≤10^9,N个数全都小于等于10000大于等于1。
==========================
=============
var
n:longint;
a:array[1..15]of longint;
v:array[1..15]of boolean;
ans:longint;
procedure init;
begin
assign(input,'eight.in');
assign(output,'eight.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
function gcd(a,b:int64):int64;
begin
if b=0 then exit(a);
gcd:=gcd(b,a mod b);
end;
procedure search(const s,t:longint);
var
time:longint;
now:int64;
i:longint;
begin
if s>n then
begin
time:=0;
now:=8;
for i:=1 to n do if v[i] then
begin
now:=now*a[i] div gcd(now,a[i]);
if now>t then break;
inc(time);
end;
if time and 1=1 then dec(ans,t div now) else
inc(ans,t div now);
exit;
end;
v[s]:=false;
search(s+1,t);
v[s]:=true;
search(s+1,t);
end;
procedure main;
var
i:longint;
x:longint;
ans1:longint;
begin
//fillchar(v,sizeof(v),true);
readln(n);
for i:=1 to n do read(a[i]);
read(x);
ans:=0;
search(1,x-1);
ans1:=ans;
ans:=0;
readln(x);
search(1,x);
writeln(ans-ans1);
end;
begin
init;
main;
terminate;
end.