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

题意:给两组数,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. innerHTML和outerHTML有什么区别

    一.区别:1)innerHTML: 从对象的起始位置到终止位置的全部内容,不包括Html标签.2)outerHTML: 除了包含innerHTML的全部内容外, 还包含对象标签本身. 二.例子1: & ...

  2. C语言范例学习02

    第二章 指针 算是重点吧,这也是C语言的特色啊,直接访问物理存储. 重点: 指针就是一个存放它指向变量地址的变量,好绕口.   区分*在定义是与引用是的作用.   区分*.&的不同.   指针 ...

  3. Spring框架之AOP

    SpringAop: 1.加入 jar 包 com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver ...

  4. 【GPU编解码】GPU硬解码---CUVID

    问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...

  5. netty Failed to submit an exceptionCaught() event异常

    最近测试netty开发的服务端应用在关闭时,出现下列异常: ->###WARN#########nioEventLoopGroup-3-2###io.netty.util.internal.lo ...

  6. windows 7文件误删shift+delete后找回

    昨天要还电脑了,结果脑子一抽,某个目录还没拷贝,shift+delete了整个目录,删除到一半,完了...我的源码都在里面还没出来啊...这TMD要命啊... 赶紧搜了一把,windows文件误删恢复 ...

  7. C# WM_NCMOUSELEAVE 消息触发

    public static extern bool TrackMouseEvent([In, Out] TRACKMOUSEEVENT lpEventTrack); [DllImport(" ...

  8. oGrid 介绍如何从 server 取的资料

    接着前次 oGrid 初探,其中有介绍如何操作local 资料,本次介绍如何从 server 取的资料. 依照 MVC 架构原理以及一条小龙本身经验来看,一个好的架构,必须要有着分工明确的设计层次,让 ...

  9. CSS 选择器汇总

    CSS 选择器 CSS 元素选择器 CSS 选择器分组 CSS 类选择器详解 CSS ID 选择器详解 CSS 属性选择器详解 CSS 后代选择器 CSS 子元素选择器 CSS 相邻兄弟选择器 CSS ...

  10. Android Studio用release模式进行调试

    有时候调试SDK必须要用release版本,但是每次打包混淆太麻烦,希望能在IDE中直接跑出release版本的应用,简单来说就是在debug模式下产生release版本的app,这时候该怎么做呢?当 ...