列表

详情


NC229749. LCMs

描述

给一个长度为的序列

输入描述

第一行包含一个正整数
第二行包含个正整数

输出描述

输出一个整数表示答案。

示例1

输入:

3
2 4 6

输出:

22

说明:

lcm(2,4)+lcm(2,6)+lcm(4,6)
=4+6+12
=22

示例2

输入:

8
1 2 3 4 6 8 12 12

输出:

313

示例3

输入:

10
356822 296174 484500 710640 518322 888250 259161 609120 592348 713644

输出:

353891724

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 367ms, 内存消耗: 26904K, 提交时间: 2022-08-05 16:55:11

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
typedef long long ll;
const int mod = 998244353;

ll cnt[N];
ll sum[N];
ll a[N];
ll inv[N];

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        cnt[a[i]]++;
    }
    inv[1]=1;
    for(int i=2;i<=1000000;i++)
    {
        inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    }
    ll ans=0;
    for(int i=1000000;i>=1;i--)
    {
        ll s1=0,s2=0;
        for(int j=i;j<=1000000;j+=i)
        {
            s1=(s1+cnt[j]*j%mod)%mod;
            s2=(s2+cnt[j]*j%mod*j%mod)%mod;
        }
        sum[i]=(s1*s1%mod-s2+mod)%mod*inv[2]%mod;
        for(int j=(i<<1);j<=1000000;j+=i)
        {
            sum[i]=(sum[i]-sum[j]+mod)%mod;
        }
        ans=(ans+inv[i]*sum[i]%mod)%mod;
    }
    cout<<ans<<endl;
}

C++ 解法, 执行用时: 646ms, 内存消耗: 12940K, 提交时间: 2021-10-29 18:47:43

//先存个答案qwq
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr int N=200010,K=1000010,p=998244353;
int inv[K],sum[K],a[N],n,cnt[K];
int main(){
    scanf("%d",&n);for(int i=1;i<=n;++i) scanf("%d",&a[i]),++cnt[a[i]];
    inv[1]=1;for(int i=2;i<K;++i) inv[i]=1ll*(p-p/i)*inv[p%i]%p;
    int ans=0;
    for(int i=K-1;i;--i){
        int s1=0,s2=0;
        for(int j=i;j<K;j+=i) s1=(s1+1ll*cnt[j]*j%p)%p,s2=(s2+1ll*cnt[j]*j%p*j%p)%p;
        sum[i]=1ll*(1ll*s1*s1%p-s2+p)*inv[2]%p;
        for(int j=(i<<1);j<K;j+=i) sum[i]=(sum[i]-sum[j]+p)%p;
        // if(i<10) printf("%d %d %d %d %d\n",i,sum[i],s1,s2,inv[i]);
        ans=(ans+1ll*inv[i]*sum[i]%p)%p;
    }
    printf("%d\n",ans);
    return 0;
}

上一题