【UR #3】核聚变反应强度

Time Limit: 1 Sec  Memory Limit: 256 MB

题目连接

http://uoj.ac/problem/48

Description

著名核物理专家 Picks 提出了核聚变特征值这一重要概念。

核聚变特征值分别为 x 和 y 的两个原子进行核聚变,能产生数值为 sgcd(x,y) 的核聚变反应强度。

其中, sgcd(x,y) 表示 x 和 y 的次大公约数,即能同时整除 x,y 的正整数中第二大的数。如果次大公约数不存在则说明无法核聚变, 此时 sgcd(x,y)=−1。

现在有 n 个原子,核聚变特征值分别为 a1,a2,…,an。然后 Picks 又从兜里掏出一个核聚变特征值为 a1 的原子,你需要计算出这个原子与其它 n 个原子分别进行核聚变反应时的核聚变反应强度,即 sgcd(a1,a1),sgcd(a1,a2),…,sgcd(a1,an)。

Input

第一行一个正整数 n。

第二行 n 个用空格隔开的正整数,第 i 个为 ai。

Output

一行 n 个用空格隔开的整数,第 i 个表示 sgcd(a1,ai)。

C/C++ 输入输出 long long 时请用 %lld。由于本题数据量较大,建议不要使用 cin/cout 进行输入输出。

Sample Input

4
12450 1 2 450

Sample Output

6225 -1 1 75

HINT

n≤105,ai≤1012

题意

题解:

算法一

对于 n=1 的数据,就是求一个数次大的约数。

众所周知一个数x的约数是成对出现的(d、xd),其中总有一个不超过x√。所以从1到a1−−√地枚举d就能找出所有a1的约数了。排序输出次大的即可。

复杂度:O(a√)
算法二

先找出a1的所有约数,然后枚举i,sgcd(a1,ai)显然也是a1的约数,所以枚举a1的所有约数,找到是ai约数的次大的即可。

复杂度:O(na√)
算法三

考虑分解质因子后:

a=px11px22...pxmm

b=py11py22...pymm

则:gcd(a,b)=pmin(x1,y1)1pmin(x2,y2)2...pmin(xm,ym)m

我们发现,a和b的公约数都一定是gcd(a,b)的约数。那么为了得到次大公约数,只需求出gcd(a,b),再除去一个最小的公共质因子即可。

对a1用O(a1−−√)的时间分解得到O(log(a1))个质因数,每次对于ai,先求出g=gcd(a1,ai),然后枚举a1的每个质因数,找到最小的能整除g那个,设其为p,g/p即为所求。(不存在则为输出−1)

复杂度:O(a√+nlog(a))
一个骗分算法

考虑算法二,我们预先对 a1 的约数们排好序,然后枚举 i,从约数表里每次二分到 gcd(a1,ai)所在位置,再往前枚举,找到第一个能整除ai的即为次大公约数。

虽然复杂度不靠谱,但是对于ai≤1012的范围实际运行速度十分优秀。需要构造针对的数据才能卡住。

还有另一个骗分算法,求出 gcd 然后暴力枚举最小质因子。好多人写这个啊……你们都没意识到复杂度不对么……放你们一马给了 80 分。

(有这种闲心的为啥不写正解啊,你们考虑过 maker 的感受吗!QAQ)

代码:

  1. //qscqesze
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <ctime>
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <set>
  9. #include <vector>
  10. #include <sstream>
  11. #include <queue>
  12. #include <typeinfo>
  13. #include <fstream>
  14. #include <map>
  15. #include <stack>
  16. typedef long long ll;
  17. using namespace std;
  18. //freopen("D.in","r",stdin);
  19. //freopen("D.out","w",stdout);
  20. #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
  21. #define maxn 200001
  22. #define mod 10007
  23. #define eps 1e-9
  24. int Res,Num;char C,CH[];
  25. //const int inf=0x7fffffff; //无限大
  26. const int inf=0x3f3f3f3f;
  27. /*
  28.  
  29. inline void P(int x)
  30. {
  31. Num=0;if(!x){putchar('0');puts("");return;}
  32. while(x>0)CH[++Num]=x%10,x/=10;
  33. while(Num)putchar(CH[Num--]+48);
  34. puts("");
  35. }
  36. */
  37. //**************************************************************************************
  38. inline ll read()
  39. {
  40. int x=,f=;char ch=getchar();
  41. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  42. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  43. return x*f;
  44. }
  45. inline void P(int x)
  46. {
  47. Num=;if(!x){putchar('');puts("");return;}
  48. while(x>)CH[++Num]=x%,x/=;
  49. while(Num)putchar(CH[Num--]+);
  50. puts("");
  51. }
  52. ll gcd(ll a,ll b)
  53. {
  54. return b==?a:gcd(b,a%b);
  55. }
  56. ll a[maxn];
  57. ll p[maxn];
  58. int main()
  59. {
  60. int n=read();
  61. for(int i=;i<n;i++)
  62. scanf("%lld",&a[i]);
  63. ll tot=;
  64. ll x=a[];
  65. for(ll i=;i<=sqrt(x);i++)
  66. {
  67. if(x%i==)
  68. {
  69. while(x%i==)x/=i;
  70. p[tot++]=i;
  71. }
  72. }
  73. for(int i=;i<n;i++)
  74. {
  75. ll d=gcd(a[],a[i]);
  76. int flag=;
  77. for(int j=;j<tot;j++)
  78. {
  79. if(d%p[j]==)
  80. {
  81. printf("%lld ",d/p[j]);
  82. flag=;
  83. break;
  84. }
  85. }
  86. if(flag)
  87. {
  88. if(d!=)
  89. printf("1 ");
  90. else
  91. printf("-1 ");
  92. }
  93. }
  94.  
  95. }

uoj 48 核聚变反应强度 次小公因数的更多相关文章

  1. 【UOJ#48】【UR #3】核聚变反应强度(质因数分解)

    [UOJ#48][UR #3]核聚变反应强度(质因数分解) 题面 UOJ 题解 答案一定是\(gcd\)除掉\(gcd\)的最小质因子. 而\(gcd\)的最小值因子一定是\(a_1\)的质因子. 所 ...

  2. 【uoj#48】[UR #3]核聚变反应强度 数论

    题目描述 给出一个长度为 $n$ 的数列 $a$ ,求 $a_1$ 分别与 $a_1...a_n$ 的次大公约数.不存在则输出-1. 输入 第一行一个正整数 $n$ . 第二行 $n$ 个用空格隔开的 ...

  3. [UOJ #48]【UR #3】核聚变反应强度

    题目大意:给你一串数$a_i$,求$sgcd(a_1,a_i)$,$sgcd(x,y)$表示$x,y$的次大公约数,若没有,则为$-1$ 题解:即求最大公约数的最大约数,把$a_1$分解质因数,求出最 ...

  4. UOJ 48 次最大公约数

    次最大公约数 = gcd / 其中一个数质因数中最小的. gcd(42,12) = 6;    div(42) = 2*3*7   div(12) = 2^2*3 sgcd(42,12) = 6 / ...

  5. [UR #3] 核聚变反应强度

    次大公约数就是gcd再除以其最小质因子(如果有的话).可以发现要求的sgcd 的前身gcd都是a1的约数,所以把a1质因数分解直接做就行了. #include<bits/stdc++.h> ...

  6. [UOJ48] 核聚变反应强度

    QUQ 思路 求出a1的所有约数,与a1.ai放入同一数组: 求出gcd(a1,ai): 枚举约数,得出ans; 代码实现 #include<cmath> #include<cstd ...

  7. UOJ#48最大矩形面积

    题面 这是一道标准的单调栈的题目,但是由于题目的个例性,该题对于前后两数等于的情况并无额外处理,so也确实是让这题简单了一点 也没什么好说的直接上代码吧 #include<iostream> ...

  8. 【UOJ Round #3】

    枚举/二分 C题太神窝看不懂…… 核聚变反应强度 QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵... ...

  9. $2018/8/15 = Day \ \ 1$杂题整理

    \(\mathcal{Morning}\) \(Task1\)高精度\(\times\)高精度 哦呵呵--真是喜闻乐见啊,我发现这一部分比较有意思于是就打算整理下来233.窝萌现在有一个整数\(A = ...

随机推荐

  1. vsftpd 安装配置详细教程

    linux下ftp软件不少,大致特点:<br /> wu-ftp:比较老牌,但针对它的攻击比较多,设置比较麻烦,但功能比较强大.<br /> vsftpd:功能强大,配置也比较 ...

  2. flask基础之jijia2模板语言进阶(三)

    前言 前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) 控制语句 和 ...

  3. 在shell中如何判断字符串是否为有效的IP地址【转】

    转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...

  4. gdb安装

    1.卸载原有gdb  以root用户登录  1.1 查询原有gdb包名,执行命令: rpm -q gdb  1.2 卸载原有gdb包,假设gdb包名为gdb-7.0-0.4.16,执行命令:rpm - ...

  5. mktime(将时间结构数据转换成经过的秒数)

    mktime(将时间结构数据转换成经过的秒数)表头文件#include<time.h>定义函数time_t mktime(strcut tm * timeptr);函数说明mktime() ...

  6. s3cmd : Add a config parameter to enable path-style bucket access 当ceph rgw使用域名时,需要支持 path-style bucket特性

    s3cmd 要是1.6.1 之后的版本 增加配置项:  vi .s3cfg use_path_mode = True 源码参考: cat  /usr/local/lib/python2.7/dist- ...

  7. hive学习(六) 参数和动态分区

    1.hive 参数.变量 1.1hive的命名空间: hive当中的参数.变量,都是以命名空间开头  

  8. C#取色器

    闲来无事,就写了一个取色器.原理其实很简单,只需要两步, 获取鼠标光标的位置, 获取当前鼠标光标的位置的RGB颜色值. 获取鼠标光标的位置: System.Drawing.Point p = Mous ...

  9. OPENSSL问题,使用fsockopen()函数提示错误

    环境配置 系统环境 CentOS7.2WDCP v3.2.2 lanmp PHP 多版本 指定使用5.6 OpenSSL 1.0.2h  3 May 2016 php.ini相关设置allow_url ...

  10. 【PAT】1001. A+B Format (20)

    1001. A+B Format (20) Calculate a + b and output the sum in standard format -- that is, the digits m ...