【容斥原理】八

 

 

【问题描述】

八是个很有趣的数字啊。八=发,八八=爸爸,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.


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值