请求卡常。另:据说有二分做法,求解答。
#include<bits/stdc++.h>
#define int long long
using namespace std;
static int n,a[2000001] = {0};
static long long m;
static int mod = 998244353;
static int v[2000001] = {0},vn = 0;
static int mp[200000001] = {0};
signed main(){
cin>>n>>m;
for(register int i = 1;i<=n;i++){
scanf("%lld",&a[i]);
mp[a[i]]++;
}
sort(a+1,a+1+n);
//v.push_back(0)
for(register int i = 1;i<=n;i++){
(a[i]!=a[i-1])?(vn++,v[vn] = a[i]):1;
}
register long long ans = 0;
register int j;
for(register int i = 1;i<=vn;i++){
for(j = i+1;j+12<=vn;j+=12){
ans+=((m/(v[i]*v[j])))*mp[v[i]]%mod*mp[v[j]]%mod;
ans+=((m/(v[i]*v[j+1])))*mp[v[i]]%mod*mp[v[j+1]]%mod;
ans+=((m/(v[i]*v[j+2])))*mp[v[i]]%mod*mp[v[j+2]]%mod;
ans+=((m/(v[i]*v[j+3])))*mp[v[i]]%mod*mp[v[j+3]]%mod;
ans%=mod;
ans+=((m/(v[i]*v[j+4])))*mp[v[i]]%mod*mp[v[j+4]]%mod;
ans+=((m/(v[i]*v[j+5])))*mp[v[i]]%mod*mp[v[j+5]]%mod;
ans+=((m/(v[i]*v[j+6])))*mp[v[i]]%mod*mp[v[j+6]]%mod;
ans+=((m/(v[i]*v[j+7])))*mp[v[i]]%mod*mp[v[j+7]]%mod;
ans%=mod;
ans+=((m/(v[i]*v[j+8])))*mp[v[i]]%mod*mp[v[j+8]]%mod;
ans+=((m/(v[i]*v[j+9])))*mp[v[i]]%mod*mp[v[j+9]]%mod;
ans+=((m/(v[i]*v[j+10])))*mp[v[i]]%mod*mp[v[j+10]]%mod;
ans+=((m/(v[i]*v[j+11])))*mp[v[i]]%mod*mp[v[j+11]]%mod;
ans%=mod;
}
while(j<=vn){
ans+=((m/(v[i]*v[j])))*mp[v[i]]%mod*mp[v[j]]%mod;
ans%=mod;
j++;
}
}
ans<<=1;
for(register short i = 1;i<=vn;i++){
ans+=((m/(v[i]*v[i])))*mp[v[i]]%mod*mp[v[i]]%mod;
ans%=mod;
}
// cout<<endl;
cout<<ans<<endl;
return 0;
}