CF1789E题解
非常有意思的题目。
我们考虑枚举每个
首先我们统计出
情况 1:
若
我们直接枚举
情况 2:
若
我们令
由此可知,当
当
这样我们就根据
对于所有
对于所有
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
int n,m;
int s[1000010];
int cnt[10000010];
void solve()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&s[i]);
m=s[n];
for(int i=1;i<=m;i++) cnt[i]=0;
for(int i=1;i<=n;i++) cnt[s[i]]++;
for(int i=1;i<=m;i++) cnt[i]+=cnt[i-1];
int ans=0;
int lst=0;
for(int i=1;i<=m;i++)
{
int sum=0;
int k=m/i;
if(m%i==0)
{
for(int j=k;j<=m;j+=k) sum+=cnt[j]-cnt[j-1];
}
else
{
if(m%(i-1)!=0&&int(m/(i-1))==k) sum=lst;
else
{
for(int j=1;j<k&&j*k<=m;j++) sum+=cnt[min(j*k+j,m)]-cnt[j*k-1];
if(1ll*k*k<=1ll*m) sum+=cnt[m]-cnt[k*k-1];
}
}
ans=(1ll*i*sum+ans)%mod;
lst=sum;
}
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--) solve();
return 0;
}
/*
*/