#19 TLE,是否为极端数据
查看原帖
#19 TLE,是否为极端数据
659460
SunsetVoice楼主2024/7/7 16:00

请求卡常。另:据说有二分做法,求解答。

#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;
}

2024/7/7 16:00
加载中...