社区讨论
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 条回复,欢迎继续交流。
正在加载回复...