卷积做法时间复杂度不对还是被卡常了?
查看原帖
卷积做法时间复杂度不对还是被卡常了?
803885
_8008008楼主2024/7/6 22:28

https://www.luogu.com.cn/record/164343090

#include<iostream>
#include<algorithm>
#include<vector>
#define int long long
const int maxn=1000001,mod=998244353;
using namespace std;
int n,m,a[maxn],num[maxn],cnt[maxn],bdiv[maxn],len;
inline int read(){
    char ch=getchar();
	int x=0,f=1;
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    } 
	while('0'<=ch&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    } return x*f;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	sort(a+1,a+1+n);
	for(int i=1;i<=n;i++){
		if(len==0){
			num[++len]=a[i];
			cnt[len]=1;
			continue;
		}
		if(num[len]!=a[i]){
			num[++len]=a[i];
			cnt[len]=1;
		}else cnt[len]++;
	}
	int ans=0;
	for(int i=1;i<=len;i++)bdiv[i]=m/num[i];
	for(int i=1;i<=len;i++){
		int nans=0;
		for(int j=1;j<=i;j++){
			int p1=(bdiv[j]/num[i])%mod;
			if(i!=j)nans+=2*cnt[j]*p1;
			else nans+=cnt[j]*p1;
			nans%=mod;
		}
		ans+=cnt[i]*nans,ans%=mod;
	}
	printf("%lld\n",ans%mod);
	return 0;
}
2024/7/6 22:28
加载中...