首页 > 其他分享 >CF1617B 题解

CF1617B 题解

时间:2022-08-25 00:44:28浏览次数:91  
标签:gcd space int 题解 times color CF1617B

题目传送门

\(\color{red}{see}\space \color{green}{in}\space \color{blue}{my}\space \color{purple}{blog}\)

小学生又双叒叕来写题解啦!

其他题解的代码都是 \(O(1)\) 的,对于小学生来说,这也太难分类讨论了。

我们可以用短除模型解决。

设 \(c \times q_1 = a\),\(c \times q_2 = b\) 并且 \(q_1\) 与 \(q_2\) 互质。

\[a + b + c = n \]

\[c \times q_1 + c \times q_2 + c = n \]

\[c \times (q_1 + q_2 + 1) = n \]

我们只需要枚举 \(c\),如果 \(c \mid n\) 就停下来,看看 \(q_1\) 与 \(q_2\) 能否构造。

此时,\(q_1 + q_2 = \dfrac{n}{c} - 1\)。

我们再枚举 \(q_1\) 与 \(q_2\),如果 \(\gcd(q_1, q_2) = 1\),说明:

\[\begin{cases}a = q_1 \times c\\b = q_2 \times c\\c = c\end{cases} \]

是其中一个解。

注意!还有一个坑点,就是 \(a \ne b \ne c\)。

所以,\(q_1\) 与 \(q_2\) 不能等于 \(1\) 哦。

到这就算完了。

如果你担心算法跑得不够快,可以往程序里输入 \(n = 10^9\) 看看会不会超时就行了。

完整代码:

#include <iostream>
#include <cstdio>
using namespace std;
int gcd(int x, int y)
{
	if (y == 0) return x;
	return gcd(y, x%y);
}
void solve()
{
	int n;
	scanf("%d", &n);
	for (int c = 1; c <= n; c++)
		if (n % c == 0)
		{
			int sum = n / c - 1;  //指 q1+q2 的结果。
			for (int q1 = 2; q1 <= n-2; q1++)  //q1 不能等于 1 所以界线有改变。
			{
				int q2 = sum - q1;
				if (gcd(q1, q2) == 1)
				{
					printf("%d %d %d\n", q1*c, q2*c, c);
					return;
				}
			}
		}
}
int main()
{
	int T;
	scanf("%d", &T);
	while (T--) solve();
	return 0;
}

首发:2022-04-19 22:26:23

标签:gcd,space,int,题解,times,color,CF1617B
From: https://www.cnblogs.com/liangbowen/p/16622837.html

相关文章

  • CF402A 题解
    题目传送门\(\color{red}{see}\space\color{blue}{in}\space\color{green}{my}\space\color{purple}{blog}\)小学生又双叒叕来写题解啦!看到其他题解描述得并不清晰,我......
  • AT4894 题解
    题目传送门小学生又双叒叕来写题解啦!翻了一下大家的思路,都用了数组,其实根本不用,可以一边读入一边判断。由于只需考虑前后两个数,所以只用两个变量就能实现滚动数组。若......
  • AT4783 题解
    题目传送门小学生又双叒叕来写题解啦!这题的关键就是贪心。看到N的范围,瞬间明白可能要排序。所以我们靠着排序来想。我们来思考一下怎样安排顺序。对于两个时间限......
  • AT4891 题解
    题目传送门小学生又双叒叕来写题解啦!这题的翻译貌似不完整。所谓怪兽与英雄的对决,就是双方同时扣同样的血,直到一方为零。弄懂题后,你会发现,这题不是考贪心,而是模拟。写......
  • AT4573 题解
    题目传送门小学生又双叒叕来写题解啦!我来介绍一种与众不同的跑得更慢的方法,那就是排序加二分。排序的作用是为了二分,因为二分的前提是数组有序。因此读入完数据后排序......
  • AT2141 题解
    题目传送门小学生又双叒叕来写题解啦!出布永远不会亏,所以只要能出布就出布。这就变成了个模拟题。需要记录石头的数量、布的数量、总分。送上满分代码:#include<iostr......
  • AT3524 题解
    题目传送门小学生又双叒叕来写题解啦!每个数都不受限制的可以变成三个数,那我们就用数组存每个数的变身情况,每次都给那三个数对应的计数器加一即可。然后呢?大家的思路都......
  • AT2162 题解
    题目传送门这题可以线性效率过,有位大神用哈希表虐橙题,太恶心厉害了,然而根本不需要。我使用双指针做这题,同样是线性效率!两个指针都是从零开始,分别指向两个字符串。每一......
  • AT3620 题解
    题目传送门做题的第一件事就是看范围。注意到范围,想到应该要使用\(O(n\times\logn)\)的办法。进而联想到排序与二分。事实证明的确要使用排序与二分。不说废话......
  • AT3525 题解
    题目传送门小学生又双叒叕来写题解啦!翻了一下大家的思路,怎么都一样?当数量达到\(10^7\)时,题解代码全爆掉!你问为什么,时间效率\(O(n)\)不稳过吗?对,可是空间复杂度呢,显......