小白不懂
查看原帖
小白不懂
1380473
ZY_202301005129楼主2024/8/22 18:45

我的代码是参考题解里面的代码做出来的,但是我自己写的时候发现这个地方(看代码注释处)反过来判断就超时,正过来则没事,这是为啥?

#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define mod 998244353
int a[5001], b[5001];
ll sum;
int qgcd(int x, int y)
{
	int xz = __builtin_ctz(x);
	int yz = __builtin_ctz(y);
	int z = min(xz, yz);
	x >>= xz;
	int zz;
	while (y)
	{
		y >>= yz;
		zz = x - y;
		yz = __builtin_ctz(zz);
		if (x > y)x = y;
		if (zz < 0)y = -zz;//这里的判断不要反过来
		else y = zz;
	}
	return x << z;
}
int main()
{
	int n;cin >> n;
	for (int i = 1;i <= n;i++)
		cin >> a[i];
	for (int i = 1;i <= n;i++)
		cin >> b[i];
	for (int i = 1;i <= n;i++)
	{
		sum = 0;
		ll num = i;
		for (int j = 1;j <= n;j++)
		{
			sum += num*qgcd(a[i], b[j]);
		
			num = num * i % mod;
		}
		cout << sum%mod << endl;
	}
}
2024/8/22 18:45
加载中...