uoj 48 核聚变反应强度 次小公因数
【UR #3】核聚变反应强度
Time Limit: 1 Sec Memory Limit: 256 MB
题目连接
http://uoj.ac/problem/48
Description
核聚变特征值分别为 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
C/C++ 输入输出 long long 时请用 %lld。由于本题数据量较大,建议不要使用 cin/cout 进行输入输出。
Sample Input
12450 1 2 450
Sample Output
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)
代码:
//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200001
#define mod 10007
#define eps 1e-9
int Res,Num;char C,CH[];
//const int inf=0x7fffffff; //无限大
const int inf=0x3f3f3f3f;
/* inline void P(int x)
{
Num=0;if(!x){putchar('0');puts("");return;}
while(x>0)CH[++Num]=x%10,x/=10;
while(Num)putchar(CH[Num--]+48);
puts("");
}
*/
//**************************************************************************************
inline ll read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
inline void P(int x)
{
Num=;if(!x){putchar('');puts("");return;}
while(x>)CH[++Num]=x%,x/=;
while(Num)putchar(CH[Num--]+);
puts("");
}
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
ll a[maxn];
ll p[maxn];
int main()
{
int n=read();
for(int i=;i<n;i++)
scanf("%lld",&a[i]);
ll tot=;
ll x=a[];
for(ll i=;i<=sqrt(x);i++)
{
if(x%i==)
{
while(x%i==)x/=i;
p[tot++]=i;
}
}
for(int i=;i<n;i++)
{
ll d=gcd(a[],a[i]);
int flag=;
for(int j=;j<tot;j++)
{
if(d%p[j]==)
{
printf("%lld ",d/p[j]);
flag=;
break;
}
}
if(flag)
{
if(d!=)
printf("1 ");
else
printf("-1 ");
}
} }
uoj 48 核聚变反应强度 次小公因数的更多相关文章
- 【UOJ#48】【UR #3】核聚变反应强度(质因数分解)
[UOJ#48][UR #3]核聚变反应强度(质因数分解) 题面 UOJ 题解 答案一定是\(gcd\)除掉\(gcd\)的最小质因子. 而\(gcd\)的最小值因子一定是\(a_1\)的质因子. 所 ...
- 【uoj#48】[UR #3]核聚变反应强度 数论
题目描述 给出一个长度为 $n$ 的数列 $a$ ,求 $a_1$ 分别与 $a_1...a_n$ 的次大公约数.不存在则输出-1. 输入 第一行一个正整数 $n$ . 第二行 $n$ 个用空格隔开的 ...
- [UOJ #48]【UR #3】核聚变反应强度
题目大意:给你一串数$a_i$,求$sgcd(a_1,a_i)$,$sgcd(x,y)$表示$x,y$的次大公约数,若没有,则为$-1$ 题解:即求最大公约数的最大约数,把$a_1$分解质因数,求出最 ...
- UOJ 48 次最大公约数
次最大公约数 = gcd / 其中一个数质因数中最小的. gcd(42,12) = 6; div(42) = 2*3*7 div(12) = 2^2*3 sgcd(42,12) = 6 / ...
- [UR #3] 核聚变反应强度
次大公约数就是gcd再除以其最小质因子(如果有的话).可以发现要求的sgcd 的前身gcd都是a1的约数,所以把a1质因数分解直接做就行了. #include<bits/stdc++.h> ...
- [UOJ48] 核聚变反应强度
QUQ 思路 求出a1的所有约数,与a1.ai放入同一数组: 求出gcd(a1,ai): 枚举约数,得出ans; 代码实现 #include<cmath> #include<cstd ...
- UOJ#48最大矩形面积
题面 这是一道标准的单调栈的题目,但是由于题目的个例性,该题对于前后两数等于的情况并无额外处理,so也确实是让这题简单了一点 也没什么好说的直接上代码吧 #include<iostream> ...
- 【UOJ Round #3】
枚举/二分 C题太神窝看不懂…… 核聚变反应强度 QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵... ...
- $2018/8/15 = Day \ \ 1$杂题整理
\(\mathcal{Morning}\) \(Task1\)高精度\(\times\)高精度 哦呵呵--真是喜闻乐见啊,我发现这一部分比较有意思于是就打算整理下来233.窝萌现在有一个整数\(A = ...
随机推荐
- tomcat和weblogic的区别
Tomcat是Apache基金会提供的Servlet容器,它支持JSP, Servlet和JDBC等J2EE关键技术,所以用户可以用Tomcat开发基于数据库,Servlet和JSP页面的Web应用, ...
- 调用HTMLTestRunner生产的报告内容为空解决办法
开始代码如下,生成报告内容为空: #coding=utf-8 import unittest,time,reimport requestsimport jsonimport HTMLTestRunne ...
- restful的设计风格
网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...
- 强大到无与伦比的Graphviz
图1 hello world 尝试画复杂一些的图: 一直苦苦寻找用于图论的画图软件,偶然在Matrix67的这篇博文里找到. Graphviz使用dot语言,这门不仅语言非常简单易学,而且功能却非常强 ...
- Mysql聚合函数count(*) 的性能分析
你首先要明确的是,在不同的 MySQL 引擎中,count(*) 有不同的实现方式. MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高: 而 ...
- **[权限控制] 利用CI钩子实现权限认证
http://codeigniter.org.cn/forums/thread-10877-1-1.html 一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了, ...
- MySQL5.7 centos7.2 yum 安装
1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum/ # 下载mysql源安装包 shell> wge ...
- Hadoop案例(二)压缩解压缩
压缩/解压缩案例 一. 对数据流的压缩和解压缩 CompressionCodec有两个方法可以用于轻松地压缩或解压缩数据.要想对正在被写入一个输出流的数据进行压缩,我们可以使用createOutput ...
- TeX中的引号(UVa272)
问题: 在Tex中,做双引号的" `` ",右双引号是" '' "(两个回车左边的).输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式. 样例输入: ...
- 谷歌翻译python接口
项目地址: https://github.com/ssut/py-googletrans 安装: sudo pip install googletrans 使用: #!/usr/bin/python ...