求解释“求多个较大数的最小公倍数并取模”的正确做法
  • 板块学术版
  • 楼主HYLW
  • 当前回复4
  • 已保存回复5
  • 发布时间2024/10/5 15:38
  • 上次更新2024/10/5 16:56:31
查看原帖
求解释“求多个较大数的最小公倍数并取模”的正确做法
663949
HYLW楼主2024/10/5 15:38

rt,求多个较大数的最小公倍数的取模,模数 998244353998244353

我数学不好T_T

这是蒟蒻的代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5050;
const ll mod = 998244353ll;
int n;
ll a[N];

ll gcd(ll a,ll b){
	return b?gcd(b,a%b):a;
}
 
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	scanf("%lld",&a[i]);
	ll g=gcd(a[1],a[2]),s=(__int128)a[1]/g*a[2]%mod;
	for(int i=3;i<=n;i++)
		g=gcd(s,a[i]),s=(__int128)s/g*a[i]%mod;
	printf("%lld\n",s);//最小公倍数 
	return 0;
}

这是正确且是一位不愿说话的大佬的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector> 
using namespace std;
typedef pair <int, int> pii;
typedef long long ll;

const int mod = 998244353, i2 = (mod + 1) / 2;
ll a[5005];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		ll x, mul = 1;
		cin >> x;
		for (int j = 1; j < i; j++)
			mul = (__int128)mul * a[j] % x;
		a[i] = x / __gcd(x, mul);
	}
	int ans = 1;
	for (int i = 1; i <= n; i++)
		ans = (__int128)ans * a[i] % mod;		
	cout << 1ll * ans % mod;
	return 0;
}

什么原理?

2024/10/5 15:38
加载中...