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

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

著名核物理专家 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。

输入格式

第一行一个正整数 n。

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

输出格式

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

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

样例一

input

4
12450 1 2 450

output

6225 -1 1 75

样例二

input

8
30030 6 10 12 55 36 450 666

output

15015 3 5 3 11 3 15 3

样例三

见样例数据下载。

下载

样例数据下载

【思路】

数论 + gcd + 质因数分解
因为两个数的最大公约数一定是这两个数质因数分解后里面相交的部分
所以如果这个最大公约数不是只由一个质因数构成
那就会有次大公约数
而这个次大公约数就会是最大公约数除以他最小的质因数

因为每个数都会和a[1]找最大公约数
所以最大公约数里面一定有a[1]的质因数
所以可以先预处理出来a[1]的质因数
然后从小到大枚举看看那一个是最大公约数的约数
发现第一个也就是最小的那个
最大公约数除以它之后就是次大公约数了

【完整代码】

#include<iostream>
#include<cstdio>
#include<vector>
#define int long long 
using namespace std;
const int Max = 100005;
int a[Max];
vector<int>prime;

void chai(int x)
{
	for(int i = 2;i * i <= x;++ i)
	{
		if(x % i == 0)prime.push_back(i);
		while(x % i == 0)x /= i;
	}
	if(x != 0)prime.push_back(x);
}

int gcd(int x,int y)
{
	if(y == 0)return x;
	return gcd(y,x % y);
}

signed main()
{
	int n;
	cin >> n;
	for(int i = 1;i <= n;++ i)
		cin >> a[i];
	chai(a[1]);
	for(int i = 1;i <= n;++ i)
	{
		int gg = gcd(a[1],a[i]);
		if(gg == 1)cout << -1 << " ";
		else
		{
			for(int j = 0;j < prime.size();++ j)
			{
				if(gg % prime[j] == 0)
				{
					cout << gg / prime[j] << " ";
					break;
				}
			}
		}
	}
	return 0;
}
posted @ 2019-10-08 16:37  acioi  阅读(306)  评论(0)    收藏  举报