提交时间:2024-07-31 11:00:41

运行 ID: 30872

#include<iostream> #include<vector> #include<algorithm> #include<set> #include<ctime> #define timeMS (clock()*1000/CLOCKS_PER_SEC) using namespace std; #define int long long const int N=1000010,P=998244353; inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } inline int fpow(int a,int b=P-2){ int c=1; for(;b;b>>=1,a=a*a%P)if(b&1)c=c*a%P; return c; } int prime[N],tot; int mnp[N]; bool tag[N]; void euler(){ for(int i=2;i<N;i++){ if(!tag[i])mnp[i]=i,prime[++tot]=i; for(int j=1;j<=tot&&prime[j]*i<N;j++){ tag[prime[j]*i]=true; mnp[prime[j]*i]=prime[j]; if(i%prime[j]==0)break; } } } vector<int>vp[N]; int ans[N]; int n,a[N]; set<int>avail; void init(){ cin>>n; avail.clear(); for(int i=1;i<=n;i++){ cin>>a[i]; int x=a[i]; while(x>1){ int cnt=0,p=mnp[x]; avail.insert(p); while(x%p==0)cnt++,x/=p; vp[p].emplace_back(cnt); } } } inline bool cmp(int x,int y){return x>y;} signed main(){ //freopen("inequality.in","r",stdin); //freopen("inequality.out","w",stdout); euler(); int t;cin>>t; while(t--){ init(); for(int i=1;i<=n;i++)ans[i]=1; for(int p:avail){ sort(vp[p].begin(),vp[p].end(),cmp); int now=n; for(int x:vp[p])ans[now]=ans[now]*fpow(p,x)%P,now--; } int res=0; for(int i=1;i<=n;i++)res=(res+ans[i])%P; printf("%lld\n",res); for(int x:avail)vp[x].clear(); } // cerr<<timeMS; return 0; }