GCD求调
  • 板块学术版
  • 楼主ZYK_luogu
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/12/24 22:39
  • 上次更新2023/12/25 14:51:50
查看原帖
GCD求调
742157
ZYK_luogu楼主2023/12/24 22:39

刚才在 CF 上写题,用到 gcd, 手搓了一个,结果跑出来 gcd(1, 1) = 0, 吓得我赶紧去 oi-wiki 看了一下 gcd 模板,然鹅模板和我的代码除变量名外一模一样,可是那个 gcd(1, 1) 跑出来是 1,求问为什么。

oi-wiki:

int gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}

手搓的诡异gcd:

int gcd_(int x, int y)
{
	// printf("gcd_(%d, %d)\n", x, y);
	if(y == 0) return x;
	return (y, x % y);
}

完整代码(只打了一半):

```cpp
/*
maxv = 3

寻找一个k,使得 gcd(k - a1, k - a2, k - a3..., k - an) 最大 
*/
#include <iostream>
#include <cstdio>

using namespace std;
const int N = 2*1e5+10;

int T, n, a[N];

int gcd(int a, int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}


int gcd_(int x, int y)
{
	printf("gcd_(%d, %d)\n", x, y);
	if(y == 0) return x;
	return (y, x % y);
}

int abs(int x)
{
	return (x > 0) ? x : -x;
}

void init(int &n_)
{
	for(int i = 0; i <= n_; i ++)
		a[i] = 0;
	n_ = 0;
}

int sol()
{
	if(n == 1)
		return 1;
	if(n == 2)
		return gcd(a[1], a[2]);
	int g = abs(a[1] - a[2]);
	int t = abs(a[2] - a[3]);
	printf("%d %d : %d\n", g, t, gcd(g, t));
	return gcd(g, t);
}

int main()
{
	cout << gcd(1, 1) << endl << gcd_(1, 1);
	scanf("%d", &T);
	
	while(T --)
	{
		init(n);
		scanf("%d", &n);
		for(int i = 1; i <= n; i ++)
			scanf("%d", &a[i]);
		
		printf("%d\n", sol());
	}
	
	return 0;
}
2023/12/24 22:39
加载中...