JZOJ.1241. Number
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。
则总个数为
\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相关推荐
- JZOJ 5266. number
Description 找出1~n范围内含有13并且能被13整除的数字的个数. Input 第一行一个n. Output 一个整数表示满足要求的数字个数. Sample Input 13 Sample ...
- [数位DP]JZOJ 3363 Number
Description JYY 来到了一个新的城市,为了和大家保持联系,第一件事就是办理新的手机号.JYY 对号码的要求很高,希望大家都能够顺畅地阅读手机号,因此 JYY 特别研究了地球人的电话号码阅 ...
- 【结论】Number(jzoj(gz) 1781)
Number jzoj(gz) 1781 题目大意: 现在给出一个x,可以把x变为4x+3或8x+7,问最少变多少次可以把x变为1000000007的倍数 输入输出样例 输入样例#1 12500000 ...
- input属性为number,maxlength不起作用的解决方案
<input type="text" maxlength="11" /> 效果ok, 当 <input type="number&q ...
- ORA-19502: write error on file xxxxx, block number xxxx
错误现象: 在ORACLE 10g下为表空间IGNITE_EGVSQL01增加数据文件时,报如下错误: SQL> ALTER TABLESPACE IGNITE_EGVSQL01 AD ...
- 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 ...
- JZOJ 5461 购物 —— 贪心
题目:https://jzoj.net/senior/#main/show/5461 贪心,原来想了个思路,优先选优惠价最小的 K 个,然后其他按原价排序遍历: 如果当前物品没选过,原价选上,如果选过 ...
- HDU 1711 Number Sequence(KMP算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...
- LeetCode 191 Number of 1 Bits
LeetCode 191 Number of 1 Bits 解法一(较为传统都解法):使用将n不断右移,并与1想&得到1的个数:(也有使用除法/2的,明显除法的运行效率要低于位移) 时间复杂度 ...
最新文章
- 电商企业纷纷结缘信息化 管理系统如何给力?
- 支付宝app支付对接2(文档和对接注意问题)
- [BUAA软工]提问回顾与个人总结
- 达梦数据库修改字段长度_DM7 达梦数据库 序列 和 自增列 说明
- 暴力破解(初级)以及弱口令工具的使用
- 程序员在周末学习的8个实用技术
- java使用httpclient封装post请求和get的请求
- Attention Model详解
- linux下可执行文件的默认扩展名为,Linux下可执行文件的默认扩展名是什么
- java工程师和全栈工程师_java全栈工程师 - 北大青鸟东莞金码学校官网
- 使用CSplitterWnd分隔窗口,左视图控制,右视图显示
- Python爬取20w+表情包,微信斗图谁怕谁!
- ele表格合并行之后的selection选中
- 【PTA】帅到没朋友(C语言)
- 【JSOI2016】扭动的回文串
- Android 开发 设置banner圆角,滑动时,图片圆角失效
- 第十五届吉林省大学生程序设计竞赛个人题解
- 老卫带你学---CSS 渐变色 (超好看)
- windows7精简版_在Windows 7简化版中使用您喜欢的壁纸
- 头歌--Java入门 - 数组基础