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

题意:给两组数,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. json在php中的使用之如何转换json为数组

    <?php $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}' ...

  2. Android笔记——Android中数据的存储方式(三)

    Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存 ...

  3. jQuery UI resizble、draggable的div包含iframe导致缩放和拖拽的不平滑解决方法

    前言 不仅仅是jQuery UI resizble的div包含iframe会导致缩放的不平滑,draggable也会出现包含iframe会导致拖放的不平滑,但是因为jQuery UI有为draggab ...

  4. javascript中apply()和call()方法的区别

    一.方法的定义 call方法: 语法:call(thisObj,Object)定义:调用一个对象的一个方法,以另一个对象替换当前对象.说明:call 方法可以用来代替另一个对象调用一个方法.call ...

  5. SAP 锁机制

    SAP锁机制一.SAP为什么要设置锁:   1,保持数据的一致性     如果几个用户要访问同样的资源,需要找到一种同步访问的方法去保持数据的一致性.比如说,在航班预订系 统中,需要检查还有没有空座位 ...

  6. 转:使用Nlog记录日志到数据库

    原文:http://www.cnblogs.com/Gyoung/archive/2012/10/18/2729613.html Nlog是一个很不错的.NET日志记录组件,它可以将日志输出到控件台, ...

  7. 桥牌笔记 Skill Level 4 C7 小心将吃

    南主打5H. 看来问题不大,但要小心南的方块AK会阻塞桥路. 如果方块3-2分布,并且将牌也3-2分布,就很容易. 如果红桃4-1分布,那是死定了. 如果方块4-1分布,还有希望完成的! 为了防止东家 ...

  8. ubuntu解决arm-linux-gcc no such file的问题

    这种情况是因为你的操作系统是Ubuntu 64位的,而交叉编译工具链都是32位执行程序.要成功运行这些交叉编译工具链,需要与这些工具链相关的32位库.安装命令如下:sudo apt-get insta ...

  9. Fresco 使用笔记(一):加载gif图片并播放

    项目总结 --------------------------------------------------------------------- 前言: 项目中图文混合使用的太多太多了,但是绝大部 ...

  10. 基础学习day01--JAVA入门和JDK的安装与配置

    一.软件是什么 软件按照一定顺序组成的计算机指令和数据集合. 二.什么是软件开发 软件开发是使用计算机的语言制作的软件.如迅雷,Windows系统,Linux,QQ等. 三.DOS常用命令 cd..: ...