社区讨论
求解释“求多个较大数的最小公倍数并取模”的正确做法
学术版参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m1vugcrh
- 此快照首次捕获于
- 2024/10/05 15:39 去年
- 此快照最后确认于
- 2025/11/04 17:59 4 个月前
rt,求多个较大数的最小公倍数的取模,模数 。
我数学不好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 条回复,欢迎继续交流。
正在加载回复...