ZOJ 3233 Lucky Number --容斥原理
这题被出题人给活活坑了,题目居然理解错了。。哎,不想多说。
题意:给两组数,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 --容斥原理的更多相关文章
- ZOJ 3233 Lucky Number
Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...
- SCU3502 The Almost Lucky Number
Description A lucky number is a number whose decimal representation contains only the digits \(4\) a ...
- 枚举 + 进制转换 --- hdu 4937 Lucky Number
Lucky Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)To ...
- HDOJ 4937 Lucky Number
当进制转换后所剩下的为数较少时(2位.3位),相应的base都比較大.能够用数学的方法计算出来. 预处理掉转换后位数为3位后,base就小于n的3次方了,能够暴力计算. . .. Lucky Numb ...
- 题目1380:lucky number
转载请注明文本链接 http://blog.csdn.net/yangnanhai93/article/details/40441709 题目链接地址:http://ac.jobdu.com/prob ...
- HDU 3346 Lucky Number
水题 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> us ...
- 九度oj 题目1380:lucky number
题目描述: 每个人有自己的lucky number,小A也一样.不过他的lucky number定义不一样.他认为一个序列中某些数出现的次数为n的话,都是他的lucky number.但是,现在这个序 ...
- 『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 ...
- B - Nearly Lucky Number
Problem description Petya loves lucky numbers. We all know that lucky numbers are the positive integ ...
随机推荐
- 【Effective Java】4、覆盖equals时请遵守通用约定
package cn.xf.cp.ch02.item8.transitivity; public class Point { private final int x; private final in ...
- 【原创】.NET Core应用类型(Portable apps & Self-contained apps)
介绍 有许多种方式可以用来考虑构建应用的类型,通常类型用来描述一个特定的执行模型或者基于此的应用.举例说:控制台应用(Console Application).Web应用(Web Applicatio ...
- Dom4j 锁竞争性能低下解决
在最近的项目中使用 Dom4j 解析 xml 发现性能低下,有锁竞争的情况,解决如下: SAXParserFactory factory = new org.apache.xerces.jaxp.SA ...
- Hazelcast介绍与使用
Hazelcast 是一个开源的可嵌入式数据网格(社区版免费,企业版收费).你可以把它看做是内存数据库,不过它与 Redis 等内存数据库又有些不同.项目地址:http://hazelcast.org ...
- 为七牛云存储开发的PHP PEAR 包:Services_Qiniu
七牛云存储Qiniu Resource (Cloud) Storage:用于存储图片.apk等静态资源. 优点: 1.使用七牛带宽和CDN,速度快,不占用开发者服务器. 2.支持图片任意格式.任意分辨 ...
- js封装tab标签页
<html> <head> <title></title> <meta charset="UTF-8"> <sty ...
- H5实现的可自定义贪吃蛇游戏
原创游戏,使用lufylegend.js开发 用canvas实现的贪吃蛇游戏,与一般的贪吃蛇游戏不同,图片经过美工设计,代码设计支持扩展和自定义. 游戏元素丰富,包括障碍物(仙人掌),金币(奖励),苹 ...
- Microsoft Dynamics CRM 2011/2013 JS操作集锦
1.Xrm.Page.context用户ID:getUserId()用户角色:getUserRoles()用户语言:getUserLcid()组织名称:getOrgUniqueName()组织语言:g ...
- SQL SERVER – Attach mdf file without ldf file in Database
Background Story: One of my friends recently called up and asked me if I had spare time to look at h ...
- android 进程/线程管理(四)----消息机制的思考(自定义消息机制)
关于android消息机制 已经写了3篇文章了,想要结束这个系列,总觉得少了点什么? 于是我就在想,android为什么要这个设计消息机制,使用消息机制是现在操作系统基本都会有的特点. 可是andro ...