bzoj 3837 pa2013 Filary】的更多相关文章

bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\),然后钦定它在我们要的剩余类里,现在再枚举其他数,看一下最多有多少个数\(a_j\)可以和他模\(m\)同余,也就是选最多的数满足\(\gcd(|a_i-a_{j_1}|,|a_i-a_{j_2}|,|a_i-a_{j_3}|...)>1\).那对于每个\(j\),把所有\(|a_i-a_j|\)…
3837: [Pa2013]Filary Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 395  Solved: 74[Submit][Status][Discuss] Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等.   求出k的最大值,并求出此时的m.如果有多组解使得k最大,你要在此基础上求出m的最大值.   Input 第一行一个正整数n(2<=n<=10^5).…
[BZOJ3837][Pa2013]Filary Description 给定n个正整数,从中挑出k个数,满足:存在某一个m(m>=2),使得这k个数模m的余数相等. 求出k的最大值,并求出此时的m.如果有多组解使得k最大,你要在此基础上求出m的最大值. Input 第一行一个正整数n(2<=n<=10^5). 第二行n个正整数w[i](1<=w[i]<=10^7).保证不会出现所有w[i]都相等的情况. Output 一行两个整数k,m.保证答案存在. Sample Inp…
[BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合中的就概率至少为\(\frac 12\). 那么我们随机选出一个数,将这个数与其他数作差,那么将这些数分解质因数后出现次数最多的数的个数就是出现次数,而含有这个质因数的所有数的\(gcd\)就是这种情况. 因为值域\(\leq 10^7\),所以你把每个数最小的质因子筛出来就可以做到\(\log\)…
Description 一个0/1矩阵,求能覆盖所有 \(1\) ,同时不覆盖所有 \(0\) 的矩阵,使这个面积最大. Sol DP/悬线法. 首先,所求的矩阵一定可以覆盖所有贴边的悬线. 用悬线法求出,高度为 \(r\) 最大的 \(c\) ,宽度为 \(c\) 最大的高度. 上下左右都要做一遍,然后更新统计答案. 上下的时候统计的是每一个高度,左右的时候统计的是每一个宽度. 这样就可以保证所有矩阵都是一个合法的矩阵了. 我多开了几个数组,发现空间炸了...然后我就开始滚了... Code…
当m取2时,k至少为$\frac{n}{2}$ 所以在最优解中每个数被选中的概率至少为$\frac{1}{2}$ 每次随机选取一个位置i,计算出其它数与$a_i$的差值,将差值分解质因数 所有质因数中出现次数的最大值加上与$a_i$相等的数的个数就是选取i的情况下的最优解 为了最大化m,需要将所有相同位置的因数乘起来 给每个位置随机一个权值,全部异或起来求出Hash值,排序后扫一遍统计即可 因为$a_i\leq10^7$,所以可以先一遍线性筛求出每个数是被哪个素数筛掉的,这样就可以做到$O(\l…
从这个FB开始写博客啦. 也不知道会坚持多久…… = =似乎要加一句转载请注明出处 http://www.cnblogs.com/DancingOnTheTree/p/4026076.html http://www.lydsy.com/JudgeOnline/problem.php?id=3737 因为是好玩的数学题所以刚看见的时候就想捉了……但是无限耽搁这两天才处理掉. 交上去各种瑕疵CE…… 改好发现数组开小各种RE…… 然后各种TLE…… 小看数据了= =. 看到题拿各种公式套,似乎是按因…
题面 权限题 题解 这题有一个很好的性质,就是一定有$k>\frac n2$.接着考虑怎么做. 我们随机选取一个数$x$,然后将所有数与它作差,那么只需要找出$k$个差值使得他们的最大公因数大于$1$即可.我们可以将所有差值分解质因数,然后统计每个质因数出现的次数,再加上与$x$相等的数的个数就是$k$.统计$k$个时候顺便记录一下这些数的最大公因数即可. 根据之前说的那个性质,我们随机出真答案的期望是$log$的.但是随机化这个东西...是靠脸的,我最开始用了那个$8$位质数做种子,然后调了$…
Description 给定正整数n和k,问能否将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示测试组数 接下来T行每行两个数n(n<=10^9),k(k<=20) Output 输出T行,若可以被分解,输出”TAK”否则输出”NIE” Sample Input 3 15 2 24 4 24 5 Sample Output TAK TAK NIE 题解 搜索+剪枝,先求出所有因数,然后暴力搜索,剪枝就是如果后面最小的k个数当前数相乘大于n就退出. orz…
参考:http://www.cnblogs.com/clrs97/p/5125976.html 瞎搞约数失败...滚去搜索 dfs(x,y,z) 表示当前可选第x到第m个约数,还要选y个约数,已有z的乘积,搜的时候减掉大于n的情况 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=2005; int n,k,tot,q[N],f[N][35];…