先上题目:

B - k-GCD

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
SubmitStatus

Problem Description

   给出n个数a[1], a[2]...... a[n]和一个正整数k, 让你在这n个数中任取k个数并求它们的GCD, 问最大的GCD是多少。
   PS: k = 1时, GCD等于所选数本身。

Input

第一行一个整数T代表测试数据的组数。
每组测试数据有两行。
第一行有两个整数n, k;
第二行有n个整数a[1], a[2]...... a[n]:

1 <= T <= 100;
2 <= k <= n <= 10000;
1 <= a[i] <= 10000;

Output

每组数据输出一行,一个整数代表最大的GCD。

Sample Input

2
5 3
12 36 20 15 9
5 4
12 36 20 15 9

Sample Output

4
3   其实这一题原本不算难,但是为什么一开始会想不到?大概是脑子习惯地去想可能需要的时间复杂度要在O(n)~O(n^2),然后就会很容易想到底是O(n)还是O(nlogn)还是O(n^2),换而言之,我们很容易不去算时间复杂度而是下意识想题目的样子大概是什么时间复杂度,往往会忘了时间复杂度的提示就在题目里面,根本不用乱猜。
  这一题的做法是把每一个数的每一个因子都求出来然后判断所有因子中,哪一种是大于等于k的,选最大的那个因子。时间复杂度只有O(n^(3/2))。 上代码:
 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define MAX 10002
using namespace std; int a[MAX];
int s[MAX];
int maxn,mm,n,k; int main()
{
int t,sq,e;
//freopen("data.txt","r",stdin);
scanf("%d",&t);
while(t--){
memset(s,,sizeof(s));
scanf("%d %d",&n,&k);
for(int i=;i<n;i++) scanf("%d",&a[i]);
mm=;
for(int i=;i<n;i++){
mm = max(a[i],mm);
sq = (int)sqrt(a[i]*1.0);
for(int j=;j<=sq;j++){
if(a[i]%j==){
s[j]++;
e = a[i]/j;
if(e != j)s[a[i]/j]++;
}
}
}
maxn=;
for(int i=;i<=mm;i++){
if(s[i]>=k) maxn = i;
}
printf("%d\n",maxn);
}
return ;
}

k-GCD

ACDream - k-GCD的更多相关文章

  1. acdream 1148 GCD SUM 莫比乌斯反演 ansx,ansy

    GCD SUM Time Limit: 8000/4000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatis ...

  2. hdu1695 GCD2 容斥原理 求x属于[1,b]与y属于[1,d],gcd(x,y)=k的对数。(5,7)与(7,5)看作同一对。

    GCD Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Sub ...

  3. hdu1695 GCD(莫比乌斯反演)

    题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...

  4. gcd和ex_gcd

    gcd就是欧几里得算法,可以快速的求出俩个数的最大公因数,进而也可以求其最大公倍数(俩数之积除以最大公因数),比较简单直接看代码就好了,一般用递归版,简短精简,敲得快,但如果数剧奇葩,怕溢出,那就用递 ...

  5. HDU 1695 GCD (莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. HDU 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. HDU1695 GCD (欧拉函数+容斥原理)

    F - GCD Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  8. 数学 赛码 1010 GCD

    题目传送门 /* 数学:官方题解 首先,数组中每个元素至少是1 然后对于任意一个询问Li, Ri, Ansi, 说明Li ~ Ri中的元素必定是Ansi的倍数,那么只需将其与Ansi取最小公倍数即可 ...

  9. BZOJ3853 : GCD Array

    1 n d v相当于给$a[x]+=v[\gcd(x,n)=d]$ \[\begin{eqnarray*}&&v[\gcd(x,n)=d]\\&=&v[\gcd(\fr ...

  10. hdu 1695 GCD(莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. Linux I2C驱动分析(三)----i2c_dev驱动和应用层分析 【转】

    本文转载自:http://blog.chinaunix.net/uid-21558711-id-3959287.html 分类: LINUX 原文地址:Linux I2C驱动分析(三)----i2c_ ...

  2. RPC通信框架——RCF介绍

    现有的软件中用了大量的COM接口,导致无法跨平台,当然由于与Windows结合的太紧密,还有很多无法跨平台的地方.那么为了实现跨平台,支持Linux系统,以及后续的分布式,首要任务是去除COM接口. ...

  3. C Looooops(扩展欧几里得+模线性方程)

    http://poj.org/problem?id=2115 题意:给出A,B,C和k(k表示变量是在k位机下的无符号整数),判断循环次数,不能终止输出"FOREVER". 即转化 ...

  4. Gym - 101981M The 2018 ICPC Asia Nanjing Regional Contest M.Mediocre String Problem Manacher+扩增KMP

    题面 题意:给你2个串(长度1e6),在第一个串里找“s1s2s3”,第二个串里找“s4”,拼接后,是一个回文串,求方案数 题解:知道s1和s4回文,s2和s3回文,所以我们枚举s1的右端点,s1的长 ...

  5. ASP之ViewState和IsPostBack

    没怎么写过ASPX页面,今天在做增删改的界面的时候,修改出了问题. 根据传过来的ObjectID加载页面数据,赋值给TextBox控件后,修改控件的值回写数据库,发现值没有变化. 简单的例子如下: 然 ...

  6. [转]"RDLC"报表-参数传递及主从报表

    本文转自:http://www.cnblogs.com/yjmyzz/archive/2011/09/19/2180940.html 今天继续学习RDLC报表的“参数传递”及“主从报表” 一.先创建D ...

  7. SnackDown Online Qualifier 2017

    好久没做题了,然后就想着随便做一个.无奈cf都是晚上,然后就看见这个,随便做做. 资格赛,只要做出来1题就行了,4天的时间. 1. 水题 #include <iostream> #incl ...

  8. X - Vasya and Socks

    Problem description Vasya has n pairs of socks. In the morning of each day Vasya has to put on a pai ...

  9. B - Chat room

    Problem description Vasya has recently learned to type and log on to the Internet. He immediately en ...

  10. JS排序之选择排序

    遍历这个数组,先确定索引为0的数字为暂时最小数, 在剩下的数据中,以第一个为标杆,和剩下的数依次进行比较,如果标杆大于某数,则进行索引交换,继续比较,则a[i]=min; 最后让a[i]与索引为0的数 ...