Minimum Modular单纯数学
来源:互联网 发布:php wsdl接口调用方法 编辑:程序博客网 时间:2024/04/29 10:37
题目描述
第1行:2个数N, K,中间用空格分隔,N表示元素的数量,K为可以移除的数的数量(1 <= N <= 5000, 0 <= K <= 4, 1 <= a[i] <= 1000000)。
输出符合条件的最小的M。
题目分析:
首先可以给定出一个暴力的方法,那就是枚举所有的i,从1开始,然后统计余数相同的数一共多出来多少个,很明显,当多出来的数大于k时则不满足情况,从小到大枚举i遇到第一个满足要求的返回即可。
但是这样很显然会超时,时间复杂度为O(N*10^6),这里有一个优化如下:
统计出所有的两两组合差值的情况,如有两个数x,y如果x % i = y %m,那么(x - y) % i = 0,统计差值将在后面的计算中发挥作用。当算法枚举到一个m的时候,那么我们就可以在O(10^6/i)的时间内统计出所有差值满足(x-y)%i=0的组数,只要统计差值为1*i, 2*i, ... , p*i <= 10^6的总数tmp即可。那么这个组数与拥有相同余数多出来的数有什么关系呢?如果(x - y) % i = 0只能够说明他们对m的余数相等,但是不能保证tmp组的余数均相等或者均不相等。
那么如果所有的tmp组每组的余数不同:如tmp = 5, i = 13. 存在如下五组:(13, 26), (14, 27), (15, 28), (16, 29), (17, 30)。那么重复的数就是5。
如果所有tmp组每组的余数都相同:如tmp = 6, i= 13. 存在如下五组:(13, 26), (13, 39), (13, 52), (26, 39), (26, 52), (39, 52)。那么重复的数就是3。
而可能的取值就是在这两个数之间的,我们取一个下限,即如果下限超过了k则可以判定退出了。k+1个相同余数的数就将不满足题意,他们一共能够生成:C(2, k+1)种组合情况,所以每次验证之前加上这个验证即可。
#include<iostream>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;int N,K;int hash[1000002];bool flag[1000002];int num[5002];int main(){while (cin >> N >> K){//Prime();int mN = 0;for (int i = 0; i < N; ++ i){cin >> num[i];for (int j = 0; j < i; ++ j){int x = num[i] - num[j];if (x < 0){x = -x;}hash[x]++;mN = max(mN,x);}}int hm = K*(K+1)>>1;for (int i = N-K;;++i){int tmp = 0;for (int j = i; j <= mN && ((tmp+=hash[j]) <= hm); j += i){}if (tmp <= hm){tmp = 0;memset(flag,0,sizeof(flag));for (int j = 0; j < N; ++ j){if (tmp > K){break;}if (flag[num[j]%i]){tmp ++;}elseflag[num[j]%i] = 1;}}if (tmp <= K){cout << i << endl;break;}}}return 0;}
- Minimum Modular单纯数学
- 枚举+剪枝 codeforces303C Minimum Modular
- 51Nod-1217-Minimum Modular
- 51nod 1217 Minimum Modular
- CodeForces Round #183 (303C) - Minimum Modular
- CodeForeces 303C——Minimum Modular
- 51NOD 1217 Minimum Modular(数论)
- [数论] 51Nod 1217 Minimum Modular & Codeforces 303C #183 (Div. 1) Minimum Modular
- CodeForce 495B Modular Equations 【数学】
- 【数学 逆元】zoj 3609 Modular Inverse
- codeforces 303C Minimum Modular(下标的艺术+math)
- 单纯
- Problem 1603 - Minimum Sum 【数学】
- Codeforces Round #334 (Div. 2) 604D Modular Arithmetic(数学+快速幂)
- 暴力+数学 HDU1394 Minimum Inversion Number
- HDU1394 Minimum Inversion Number 线段树+数学
- Modular Inverse
- Modular Fibonacci
- openwrt编译基本教程
- 新浪微博XSS攻击代码简要解析
- MFC应用程序中处理消息的顺序,创建窗口的过程关闭窗口的顺序(非模态窗口),打开模式对话框的函数调用顺序
- JAVA学习.JAVA集合类型Collection.Set.HashSet&TreeSet
- mysql查询方式
- Minimum Modular单纯数学
- 片上总线Wishbone 学习(十)总线周期之单写读操作
- 继承UILabel类实现Label竖直对齐
- iOS UILabel详解
- asp.net调用jqueryajax
- Windows:Windows 8下添加Windows Defender到右键菜单
- NIO - Buffer缓冲区
- Java命名规范
- css3之transform-styl 3D旋转效果