1616 最小集合 51NOD(辗转相处求最大公约数+STL)
A君有一个集合。
这个集合有个神奇的性质。
若X,Y属于该集合,那么X与Y的最大公因数也属于该集合。
但是他忘了这个集合中原先有哪些数字。
不过幸运的是,他记起了其中n个数字。
当然,或许会因为过度紧张,他记起来的数字可能会重复。
他想还原原先的集合。
他知道这是不可能的……
现在他想知道的是,原先这个集合中至少存在多少数。
该集合中一定存在的是{1,2,3,4,6}
第一行一个数n(1<=n<=100000)。
第二行n个数,ai(1<=ai<=1000000,1<=i<=n)。表示A君记起来的数字。
输入的数字可能重复。
输出一行表示至少存在多少种不同的数字。
5
1 3 4 6 6
5
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
set<int>se;
int n;
int b[],ans;
int gcd(int x,int y){
return x == ? y: gcd(y % x, x);
}
int main(){
cin>>n;
for(int i = ; i < n; i++){
cin>>b[i];
se.insert(b[i]);
}
for(int i = ; i < n; i++){
for(int j = i+; j < n; j++){
se.insert(gcd( b[i] , b[j] ));
}
}
cout<<se.size();
}
错误思路:输入数b,用STL中的set集合存储,因为set集合不含有相同的元素,所以实现了去重;
然后两两比较找GCD,存入集合se中,最后se的长度就是所存数子个数,但由于数据范围极大,所以上面的做法不能过全部数据点;
#include <iostream>
#include <cstdio>
#include <cstdlib>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int read(int &n)
{
char ch=' ';int q=,w=;
for(;(ch!='-')&&((ch<'')||(ch>''));ch=getchar());
if(ch=='-')w=-,ch=getchar();
for(;ch>='' && ch<='';ch=getchar())q=q*+ch-;n=q*w;return n;
}
int m,n,ans;
bool a[];
int gcd(int x,int y){return y?gcd(y,x%y):x;}
int main()
{
int q,w=;
read(n);
fo(i,,n)a[read(q)]=,m=max(m,q),w=gcd(q,w);
if(w==)ans=;
fo(i,,m)
{
q=w=;
fo(j,,m/i)if(a[j*i])q=gcd(j,q),w++;
if((q==&&w-)||a[i])ans++;
}
printf("%d\n",ans);
return ;
}
正确思路:
很简单,只要枚举每个数,再枚举它的倍数来判断它在不在集合中,
判断只要看看输入的数中,所以是它的倍数的数的gcd是不是1即可,
我们知道:∑ni=1ni=nlog2(n);
复杂度:O(m∗log2(m)2)m<=106
题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1616
1616 最小集合 51NOD(辗转相处求最大公约数+STL)的更多相关文章
- 51NOD 1616 最小集合
传送门 分析 不难发现集合中的数一定是集合内其它一堆数的$gcd$ 于是我们枚举$i$,统计原来集合中有几个数是$i$的倍数,设这个值为$f(i)$ 之后对于每个$i$如果不存在$f(x*i) = f ...
- 【转载】C#中使用Average方法对List集合中相应元素求平均值
在C#的List集合操作中,有时候需要对List集合元素进行汇总求平均值,如数值类型的List集合元素,有时候对象类型的List集合也需要对集合中的元素的某个对象进行汇总求平均值,此时都可以使用到Av ...
- 【转载】C#编程中两个List集合使用Intersect方法求交集
在C#语言程序设计中,List集合是常用的集合数据类型,在涉及集合类型的运算中,有时候我们需要计算2个List集合中共有的数据,即对2个List集合求交集运算.此时可以使用C#语言提供的Interse ...
- [算法]求满足要求的进制(辗转相除(欧几里得算法),求最大公约数gcd)
题目 3在十进制下满足若各位和能被3整除,则该数能被3整除. 5在十六进制下也满足此规律. 给定数字k,求多少进制(1e18进制范围内)下能满足此规律,找出一个即可,无则输出-1. 题解 写写画画能找 ...
- 辗转相除 求最大公约数!or 最小公倍数
求最大公约数和最小公倍数的经典算法--辗转相除法描述如下: 若要求a,b两数的最大公约数和最小公倍数,令a为a.b中较大数,b为较小数,算法进一步流程: while(b不为0) { temp=a%b: ...
- java求最大公约数(分解质因数)
下面是四种用java语言编程实现的求最大公约数的方法: package gcd; import java.util.ArrayList; import java.util.List; public c ...
- Java求最大公约数和最小公倍数
最大公约数(Greatest Common Divisor(GCD)) 基本概念 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的 ...
- 51nod 1179 最大的最大公约数
1179 最大的最大公约数 题目来源: SGU 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出N个正整数,找出N个数两两之间最大公约数的最大值.例如:N = ...
- Euclid求最大公约数
Euclid求最大公约数算法 #include <stdio.h> int gcd(int x,int y){ while(x!=y){ if(x>y) x=x-y; else y= ...
随机推荐
- php 计算字符串长度
在项目的开发中,常常遇到要计算一个字符串的长度(中英文结合),由于产品要求不同,每个中文的长度要求也不一样. 解决utf-8编码下的字符串长度(可自定义每个中英文算几个字节) /** * 计算字符串长 ...
- CF459B Pashmak and Flowers (水
Pashmak and Flowers Codeforces Round #261 (Div. 2) B. Pashmak and Flowers time limit per test 1 seco ...
- Java实验1-文件IO
目标:掌握Java类的创建,Java I/O操作,Java集合类的使用等 内容: 王老师非常喜欢读书,为了便于查阅,他每次买书回家后就在笔记本上登记每本书的详细信息(书名.作者.出版社.出版日期.价 ...
- 在lua脚本中使用我们自定义的精灵类
首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite // // HSprite.h // cocos2dx_lua_tests_by_Himi ...
- Hibernate框架之入门案例
今天终于开始学习了三大框架的其中一个框架,Hibernate框架,在这里不去讲Hibernate框架的一些基础概念了,直接切入代码,带大家了解一下Hibernate能干什么, Hibernate的人们 ...
- loadrunner-27796错误寻求解决办法
Action.c(58): Error -27796: Failed to connect to server "www.baidu.com:80": [10048] Addres ...
- discuz个人空间主题列表 图片模式实现方法
discuz X3空间主题列表 图片展现模式,discuz实现个人空间主题列表调用图片模式,discuz home图片列表 如果需要实现该呈现方式,我们需要首先了解discuz封面图片存储原理:dis ...
- post 之checkbox 未被选中解决方法
第一种方法: http://cnn237111.blog.51cto.com/2359144/1293812 第二种方法(推荐): http://blog.csdn.net/xyanghomepage ...
- springMVC之国际化
1.工程结构 2.jar包 3.配置文件spring-config.xml,springMVC配置文件 <?xml version="1.0" encoding=" ...
- java中二进制和流的相互转换
流转二进制 public static byte[] toByteArray(InputStream in) throws IOException { ByteArrayOutputStream ou ...