这题被出题人给活活坑了,题目居然理解错了。。哎,不想多说。

题意:给两组数,A组为幸运基数,B组为不幸运的基数,问在[low,high]区间内有多少个数:至少被A组中一个数整除,并且被B中任意一个数整除。|A|<=15.

分析:看到A长度这么小,以及求区间内满足条件的个数问题,容易想到容斥原理,因为不被B中任意一个数整除,所以将B数组所有数取一个最小公倍数LCM,那么就变成了幸运数字都不会被这个LCM整除。

然后枚举子集,实现要将A中元素去除相互整除的情况,比如A = [2,4],这时因为被至少一个数整除就行,那么一个2就可以满足了,将4去掉。

设A1 = {区间内被a1整除的数},A2 = {区间内被a2整除的数},...An = {区间内被an整除的数}

那么由于:

然后还要处理不被LCM整除的情况,设Bi = {区间内被 i 整除的数},则要减去的数为:

(cnt为数的个数)

所以就可以做容斥了。

一段区间[low,high]内被k整除的数的个数为: high/k-(low-1)/k

注意处理爆long long的情况

代码: (0ms)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
#define N 100007 ll a[],aa[];
ll b[];
int vis[]; ll gcd(ll a,ll b)
{
if(!b)
return a;
return gcd(b,a%b);
} int calc(int S) //计算数的个数
{
int cnt = ;
while(S)
{
if(S&)
cnt++;
S >>= ;
}
return cnt;
} int main()
{
int n,m,i,j;
ll low,high;
ll cnt;
int S;
while(scanf("%d%d%lld%lld",&n,&m,&low,&high)!=EOF)
{
if(n == && m == && low == && high == )
break;
for(i=;i<n;i++)
scanf("%lld",&a[i]);
for(i=;i<m;i++)
scanf("%lld",&b[i]);
memset(vis,,sizeof(vis));
sort(a,a+n);
for(i=;i<n;i++)
{
if(vis[i])
continue;
for(j=i+;j<n;j++)
{
if(vis[j])
continue;
if(a[j]%a[i] == ) //去除冗余
vis[j] = ;
}
}
int ka = ;
for(i=;i<n;i++)
{
if(!vis[i])
aa[ka++] = a[i];
}
ll lcm = 1LL;
int tag = ;
for(i=;i<m;i++) //求LCM
{
lcm = lcm*b[i]/(gcd(lcm,b[i]));
if(lcm > high || lcm < )
{
tag = ;
break;
}
}
if(!tag) //爆出,不管
lcm = high+;
S = (<<ka)-; //总状态数
ll ans = ;
for(int state=;state<=S;state++)
{
int c = calc(state);
int sign = (c%?1LL:-1LL); //根据个数定符号
int tmp = state;
i = ;
ll antibase = 1LL;
ll base = 1LL;
int flag = ;
while(i<ka) //子集
{
if(tmp&)
{
base = base/gcd(base,aa[i])*aa[i];
if(base > high || base < )
{
flag = ;
break;
}
}
tmp>>=;
i++;
}
if(!flag)
continue;
ans += sign*(high/base-(low-1LL)/base);
if(!tag) //LCM爆范围,不管
continue;
antibase = base/(gcd(base,lcm))*lcm;
ans -= sign*(high/antibase-(low-1LL)/antibase);
}
printf("%lld\n",ans);
}
return ;
}

(有发现不对的地方欢迎评论指出)

ZOJ 3233 Lucky Number --容斥原理的更多相关文章

  1. ZOJ 3233 Lucky Number

    Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...

  2. SCU3502 The Almost Lucky Number

    Description A lucky number is a number whose decimal representation contains only the digits \(4\) a ...

  3. 枚举 + 进制转换 --- hdu 4937 Lucky Number

    Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  4. HDOJ 4937 Lucky Number

    当进制转换后所剩下的为数较少时(2位.3位),相应的base都比較大.能够用数学的方法计算出来. 预处理掉转换后位数为3位后,base就小于n的3次方了,能够暴力计算. . .. Lucky Numb ...

  5. 题目1380:lucky number

    转载请注明文本链接 http://blog.csdn.net/yangnanhai93/article/details/40441709 题目链接地址:http://ac.jobdu.com/prob ...

  6. HDU 3346 Lucky Number

    水题 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> us ...

  7. 九度oj 题目1380:lucky number

    题目描述: 每个人有自己的lucky number,小A也一样.不过他的lucky number定义不一样.他认为一个序列中某些数出现的次数为n的话,都是他的lucky number.但是,现在这个序 ...

  8. 『NYIST』第九届河南省ACM竞赛队伍选拔赛[正式赛二]- Nearly Lucky Number(Codeforces Beta Round #84 (Div. 2 Only)A. Nearly)

    A. Nearly Lucky Number time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  9. B - Nearly Lucky Number

    Problem description Petya loves lucky numbers. We all know that lucky numbers are the positive integ ...

随机推荐

  1. 利用jquery实现网页禁止鼠标右键、禁止复制

    很多时候,网站的内容辛苦写法被轻松复制,为了不让自己的劳动成果外流,可以利用禁止鼠标右键等方式保护自己的原创内容! 方式1:禁止鼠标右键操作 <script src="http://l ...

  2. Exchange 2013 申请证书

    最近在了解Exchange2013,Exchange2013相对于Lync安装相对容易一点,安装完成并不代表就可以用了,还要一些基本的配制,首先介绍一下如何从证书服务器申请 CA. 一.DNS 创建解 ...

  3. js得到屏幕宽高、页面宽高 (window.screen.availHeight)等--笔记

    window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏幕高度(空白空间) window.screen.width ...

  4. Mybatis学习记录(七)----Mybatis延迟加载

    1.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: ...

  5. Python基础(2)--对象类型

    Python使用对象模型来存储数据.构造任何类型的值都是一个对象 所有的Python对象都拥有三个特性:身份.类型.值 身份: 每一个对象都有一个唯一的身份来标志自己,任何对象的身份可以使用内建函数i ...

  6. Caused by: java.lang.UnsupportedOperationException

    对Arrays.asList()返回的List进行操作之后报错Caused by: java.lang.UnsupportedOperationException 让我们来看一下Arrays.asLi ...

  7. 【读书笔记】iOS网络-运行循环

    运行循环是由类NSRunLoop表示的,有些线程可以让操作系统唤醒睡眠的线程以管理到来的事件,而运行循环则是这些线程的基本组件.运行循环是这样一种循环,可以在一个周期内调度任务并处理到来的事件.iOS ...

  8. JSPatch一些容易犯错的地方

    JSPatch一些自己使用后的发现: 1.JS不区分整数和浮点数.解析字典以后的value不需要通过 floatValue等方法转换,而是自动就转换成对应的数据类型. 2.nil在JSPatch中 不 ...

  9. SQL Server智能感知如何更新

    经常用sql server发现一个问题,比如说我刚刚添加个表或者字段,这时候在sqlserver里面写sql语句时,没有智能提示,这个问题我以前一直不是太注意.今天好好找了下解决方法,这里做下分享. ...

  10. 如何在linux系统中设置静态ip地址

    在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 开始编辑,填写ip地址.子网掩码.网关.DNS等.其中"红框内的信息"是必须 ...