题解 | 第三心脏
第三心脏
https://www.nowcoder.com/practice/7a18dc66ff5142c58ae86a6cfecd8ac6
人多力量大啊,群友助我破鼎!
本题代码很简单,但是要点思维
观察样例可发现,拿第三组数据举例子,应该是2*a。
但是第一组又不是这样的,因为b=2*a了,所以输出的变成了3*a
而观察第二组又发现,b!=2*a了,可还是不可以输出2*a,为什么呢?
因为2和第二组数据的第二个数的gcd为2,不等于gcd(2,7)
所以经过以上分析,我们基本就明白了——要求的就是在b除gcd(a,b)后得到的数尽可能贴近2,再拿这个数*a即可
要想尽可能接近2,就要从2开始不断+1,如果发现了1个k的值满足等于1了的话就说明gcd(a,b)=gcd(b,c)
光这么说很抽象,举个例子吧:
12 72
如果直接输出24,很显然,gcd分别为12,24,并不相同,不符合题意,而12和24不相同的根本原因就是a/gcd(a,b)=1,而b/gcd(a,b)=6,6是合数!有因子2和3,这就导致如果最后输出的是2*a,3*a甚至4*a的话,都会使gcd(b,c)多乘上了这个因子!进而导致gcd变成原来的因子倍!所以我们要找的就是gcd(b,c)和k互质的时候,最小的k是几。(此处为5)
最后附上代码awa
#include <bits/stdc++.h>
using namespace std;
#define sc second
#define fr first
#define int long long
#define itn long long
#define fro for
#define vi vector<int>
#define vvi vector<vector<int>>
#define pii pair<int, int>
#define endl '\n'
#define all(qwq) qwq.begin(), qwq.end()
#define ui unordered_map<int, int>
#define pq priority_queue
#define pi acos(-1)
// const int dx[4] = {-1, 1, 0, 0};
// const int dy[4] = {0, 0, -1, 1};
// const int dx[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
// const int dy[8] = {1, 1, 1, 0, -1, -1, -1, 0};
// const int dx[12] = {-1, 0, 1, 1, 1, 0, -1, -1, 0, 2, -2, 0};
// const int dy[12] = {1, 1, 1, 0, -1, -1, -1, 0, 2, 0, 0, -2};
// const int mod = 998244353;
// const int mod = 1e9 + 7;
int m, n, k, x, y, num, op, sum = 0, cnt = 0;
string s;
void _()
{
int a, b;
cin >> a >> b;
int k = 2;
while (gcd(k, b / gcd(a, b)) != 1)//在详细解释中,此处的“k”为待取的最小值, b / gcd(a, b)) 为6,若二者互质则可以取到
{
k++; //找到最小的k
}
cout << k * a << endl;//ak!(一语双关)
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(nullptr), cout.tie(nullptr);
int awa = 1;
cin >> awa;
while (awa--)
{
_();
}
return 0;
}
思路来源——粉丝群群友,************,***************(牛客不让发群号qwq)

查看16道真题和解析