rt,求多个较大数的最小公倍数的取模,模数 998244353。
我数学不好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;
}
什么原理?