社区讨论

L求调

学术版参与者 2已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mj5fvi3g
此快照首次捕获于
2025/12/14 16:04
2 个月前
此快照最后确认于
2025/12/17 16:35
2 个月前
查看原帖
rt,对每一种分组方式求前缀和,但是WA
或者大佬们能不能给出L的思路
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=500020,P=1e9+7;
int a[N],summ[N];
vector <int> sum[N],sumf[N];
int qpow(int x,int y){
	int r1=x,r2=1;
	while(y>1){
		if(y%2==1) r2=r2*r1%P;
		r1=r1*r1%P;y/=2;
	}
	return r1*r2%P;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int n,q,l,R;
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++) summ[i]=(summ[i-1]+a[i])%P;
	for(int i=1;i<=n;i++){
		sum[i].push_back(0);
		for(int j=1;j<=n/i;j++)
			sum[i].push_back((sum[i][j-1]+qpow((summ[j*i]-summ[(j-1)*i]+P)%P,2))%P);
	}
//	cout<<sum[2][1]<<" "<<sum[2][2]<<" "<<sum[2][3]<<"\n";
	for(int i=1;i<=n;i++){
		sumf[i].push_back(0);
		for(int j=1;j<=n/i;j++)
			sumf[i].push_back((sumf[i][j-1]+qpow((summ[n-(j-1)*i]-summ[n-j*i])+P%P,2))%P);
	}
	while(q--){
		cin>>l>>R;
		if(n%l==0) cout<<(sum[l][n/l]*qpow(l*l%P,P-2)+P)%P<<"\n";
		else{
			int p=n%l,q=n/l,r=p%q,s=p/q;
			l+=s;
//			cout<<p<<" "<<q<<" "<<r<<" "<<s<<" "<<l<<"\n";
			if(l+(r>0?1:0)>R){
				cout<<"-1\n";
				continue;
			} 
			int ans=0;
			if(r>0) ans=(ans+sum[l+1][r]*qpow((l+1)*(l+1)%P,P-2))%P;
			ans=(ans+sumf[l][q-r]*qpow(l*l%P,P-2))%P;
			cout<<(ans+P)%P<<"\n";
		}
	}
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...