求hank数据来证明我代码有错误
  • 板块题目总版
  • 楼主xiexinxin
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/10 13:15
  • 上次更新2024/7/10 14:45:54
查看原帖
求hank数据来证明我代码有错误
926978
xiexinxin楼主2024/7/10 13:15

求求了!

调了一天了,还是只有10分,用自己的代码和题解对拍了好几组数据都没问题,不知道哪里错了QWQ

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[2000001],cnt,ans,t[2000001],b[2000001],bb,q[2000001],cn; 
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]>10000) cnt++;
		if(a[i]<=1000000){
			t[a[i]]++;
			if(t[a[i]]==1){
				bb++,b[bb]=a[i];
				if(a[i]<=10000) cn++; 
			}
		}
	}
	sort(a+1,a+n+1);
	sort(b+1,b+bb+1);
	long long ii=1;
	for(long long i=1;i<=1000000;i++){
		q[i]=t[i]+q[i-1];
		q[i]%=998244353;
	}
	for(long long i=1;i<=cn;i++){
		for(long long j=1;j<=cn;j++){
			ans+=((m/(b[i]*b[j]))*t[b[i]]*t[b[j]])%998244353;
			ans%=998244353;
		}
	}
	long long o;
	ii=1;
	for(long long i=n;i>=n-cnt+1;i--){
		o=m/a[i];
		for(long long j=1;j<=bb;j++){
			if(b[j]>=sqrt(o)) break;
			ans=(ans+(o/b[j])*t[b[j]]*2)%998244353;
		}
		for(long long j=1;j<=(long long)sqrt(o);j++){
			if(o/j>10000&&o/(j+1)<=10000){
				ans=(ans+j*(q[o/j]-q[10000])%998244353)%998244353;
				ans=(ans+j*(q[10000]-q[o/(j+1)])*2)%998244353;
			}
			else if(o/j>10000) ans=(ans+j*(q[o/j]-q[o/(j+1)])%998244353)%998244353;
			else ans=(ans+j*(q[o/j]-q[o/(j+1)])*2)%998244353;
		}
	}
	cout<<ans%998244353;
	return 0;
}
2024/7/10 13:15
加载中...