Problem

Description

有N(2<=N<=15)个数A1,A2,….,An-1,An,如果在这N个数中,有且仅有一个数能整除m,那么整数m就是一个幸运数,你的任务就是在给定A1,A2,….,An-1,An的情况下,求出第k小的幸运数。

Input

第一行为一整数数N,K(2<=N<=15,1<=K<=2^31-1),意义如上述。
接下来一行有N个整数,A1,A2,….,An-1,An,这N个整数均不超过2^31-1。

Output

输出一行,仅包含一个整数ans,表示第K小的幸运数。答案保证不超过10^15。

Sample Input

输入1:
2 4
2 3
输入2:
2 100
125 32767

Sample Output

输出1:
8
输出2:
12500

Hint

对于50%的数据,N<=5,ANS<=100000
对于80%的数据,N<=10,ANS<=10^15
对于100%的数据,N<=15,ANS<=10^15

Solution

正解:二分+容斥
二分答案mid,现在就是要求在[1,mid]这个范围内,幸运数的个数 Si S_i。
则总个数为

Σni=1mida[i]

\Sigma_{i=1}^{n}\frac{mid}{a[i]}
如果它小于k则mid要增大,否则减小。
但是,这里面一定多算了很多的数。比如说序列{2,3}其中6不是幸运数,2这里算了一次,3这里又算了一次,所以个数要-2.(6是2,3的交集,所以我们要减去2和3的交集)
由容斥原理得,对于一个集合,如果集合元素个数为基数,则加上这个集合所有元素的LCM*集合元素个数否则减去。
由于N<=15,我们可以用 2n 2^n 的时间来查找所有的集合。
总时间复杂度为 O(log(1015)∗2n∗算LCM的时间) O(log(10^{15})*2^n*算LCM的时间).

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define LL long long
using namespace std;
LL a[20],l,mid,r,ans,sum;
int i,n,k;
LL gcd(LL a,LL b)
{if (b==0) return a;else return gcd(b,a%b);
}
LL lcm(LL a,LL b)
{if (a>b) swap(a,b);return a*b/gcd(a,b);
}
void select(LL x,LL s,LL cnt)
{if (x>n){if (cnt>0){if (cnt%2==1) ans+=(mid/s)*cnt;else ans-=(mid/s)*cnt;}return;}LL w;select(x+1,s,cnt);w=lcm(s,a[x]);if (w>mid) return;   //特别注意:如果LCM超过了mid要退出去,否则会爆炸。select(x+1,w,cnt+1);
}
int main()
{scanf("%d%d",&n,&k);fo(i,1,n) scanf("%lld",&a[i]);l=1;r=1000000000000000;while (l<r){mid=(l+r)/2;ans=0;select(1,1,0);if (ans<k) l=mid+1;else r=mid;}printf("%lld",l);
}

——2016.7.12

JZOJ.1241. Number相关推荐

  1. JZOJ 5266. number

    Description 找出1~n范围内含有13并且能被13整除的数字的个数. Input 第一行一个n. Output 一个整数表示满足要求的数字个数. Sample Input 13 Sample ...

  2. [数位DP]JZOJ 3363 Number

    Description JYY 来到了一个新的城市,为了和大家保持联系,第一件事就是办理新的手机号.JYY 对号码的要求很高,希望大家都能够顺畅地阅读手机号,因此 JYY 特别研究了地球人的电话号码阅 ...

  3. 【结论】Number(jzoj(gz) 1781)

    Number jzoj(gz) 1781 题目大意: 现在给出一个x,可以把x变为4x+3或8x+7,问最少变多少次可以把x变为1000000007的倍数 输入输出样例 输入样例#1 12500000 ...

  4. input属性为number,maxlength不起作用的解决方案

    <input type="text" maxlength="11" /> 效果ok, 当 <input type="number&q ...

  5. ORA-19502: write error on file xxxxx, block number xxxx

    错误现象: 在ORACLE 10g下为表空间IGNITE_EGVSQL01增加数据文件时,报如下错误: SQL> ALTER TABLESPACE IGNITE_EGVSQL01      AD ...

  6. LeetCode刷题记录10——434. Number of Segments in a String(easy)

    LeetCode刷题记录10--434. Number of Segments in a String(easy) 目录 LeetCode刷题记录9--434. Number of Segments ...

  7. JZOJ 5461 购物 —— 贪心

    题目:https://jzoj.net/senior/#main/show/5461 贪心,原来想了个思路,优先选优惠价最小的 K 个,然后其他按原价排序遍历: 如果当前物品没选过,原价选上,如果选过 ...

  8. HDU 1711 Number Sequence(KMP算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...

  9. LeetCode 191 Number of 1 Bits

    LeetCode 191 Number of 1 Bits 解法一(较为传统都解法):使用将n不断右移,并与1想&得到1的个数:(也有使用除法/2的,明显除法的运行效率要低于位移) 时间复杂度 ...

最新文章

  1. 电商企业纷纷结缘信息化 管理系统如何给力?
  2. 支付宝app支付对接2(文档和对接注意问题)
  3. [BUAA软工]提问回顾与个人总结
  4. 达梦数据库修改字段长度_DM7 达梦数据库 序列 和 自增列 说明
  5. 暴力破解(初级)以及弱口令工具的使用
  6. 程序员在周末学习的8个实用技术
  7. java使用httpclient封装post请求和get的请求
  8. Attention Model详解
  9. linux下可执行文件的默认扩展名为,Linux下可执行文件的默认扩展名是什么
  10. java工程师和全栈工程师_java全栈工程师 - 北大青鸟东莞金码学校官网
  11. 使用CSplitterWnd分隔窗口,左视图控制,右视图显示
  12. Python爬取20w+表情包,微信斗图谁怕谁!
  13. ele表格合并行之后的selection选中
  14. 【PTA】帅到没朋友(C语言)
  15. 【JSOI2016】扭动的回文串
  16. Android 开发 设置banner圆角,滑动时,图片圆角失效
  17. 第十五届吉林省大学生程序设计竞赛个人题解
  18. 老卫带你学---CSS 渐变色 (超好看)
  19. windows7精简版_在Windows 7简化版中使用您喜欢的壁纸
  20. 头歌--Java入门 - 数组基础

热门文章

  1. [SHOI2003]吃豆豆(dp+拓扑排序)
  2. dlib人脸对齐源码详解
  3. 【Ted】每日Ted
  4. 港大全面封杀ChatGPT!AI肆虐高校,作弊丑闻震惊全世界
  5. vscode-源码分析路程(一)
  6. 访问mysql的urn地址,URL,URI 和URN 之间的区别
  7. Yog2 中的模块化思想
  8. 微软三号人物约翰逊:收购雅虎势在必得
  9. Python财经实践,股票数据获取及可视化展示
  10. 莱布尼茨数学思想的统一性