社区讨论

求解释“求多个较大数的最小公倍数并取模”的正确做法

学术版参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m1vugcrh
此快照首次捕获于
2024/10/05 15:39
去年
此快照最后确认于
2025/11/04 17:59
4 个月前
查看原帖
rt,求多个较大数的最小公倍数的取模,模数 998244353998244353
我数学不好T_T
这是蒟蒻的代码:
CPP
#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;
}
这是正确且是一位不愿说话的大佬的代码:
CPP
#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;
}
什么原理?

回复

5 条回复,欢迎继续交流。

正在加载回复...