NOIO 普及 T2 的奇妙想法
  • 板块学术版
  • 楼主happybob
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/3/26 21:12
  • 上次更新2023/10/28 05:28:46
查看原帖
NOIO 普及 T2 的奇妙想法
332914
happybob楼主2022/3/26 21:12
#include <bits/stdc++.h>
using namespace std;

long long t, x, z;

long long g(long long a, long long b)
{
	while (b)
	{
		long long temp = a;
		a = b;
		b = temp % b;
	}
	return a;
}

long long sg(long long x, long long y, long long p)
{
	p--;
	long long t = min(x, y), k = 2, sa = 0;
	for (k; k * k <= t; k++)
	{
		if (x % k == 0 and y % k == 0)
		{
			sa++;
			if (sa == p) return g(x / k, y / k);
		}
	}
	return 1;
}

inline long long read()
{
	char ch = getchar();
	long long z = 0;
	while (ch < '0' || ch > '9') ch = getchar();
	while (ch >= '0' and ch <= '9')
	{
		z = (z << 1) + (z << 3) + (ch ^ 48);
		ch = getchar();
	}
	return z;
}

int main()
{
	//freopen("math.in", "r", stdin);
	//freopen("math.out", "w", stdout);
	t = read();
	while (t--)
	{
		x = read(), z = read(); 
		long long b = z / x, res = b / g(x, b);
		if (x * res * g(x, res) != z)
		{
			long long sa = 2;
			while (sa <= 45)
			{
				res = b / sg(x, b, sa);
				if (x * res * g(x, res) == z) break;
				sa++;
			}
		}
		if (x * res * g(x, res) == z) printf("%lld\n", res);
		else puts("-1");
	}
	return 0;
}

赛时写了个这个,大样例是对的,跑得很快,但是这个方法是不是有问题?因为我总感觉这份代码解释不清。

2022/3/26 21:12
加载中...