#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int sqn;//卡常了
struct node {
int l,r,pos;//pos表示询问顺序
} ask[50010];
int cnt[50010];
int ansfz[50010],ansfm[50010];
int c[50010];
bool cmp(node nd1,node nd2) {
if(nd1.l/sqn!=nd2.l/sqn)return nd1.l/sqn<nd2.l/sqn;
return nd1.r<nd2.r;
}
int fenzi,fenmu;
void del(int x) {
fenzi-=cnt[c[x]]*(cnt[c[x]]-1)/2;
cnt[c[x]]--;
fenzi+= cnt[c[x]]*(cnt[c[x]]-1)/2;
}
void add(int x) {
fenzi-=cnt[c[x]]*(cnt[c[x]]-1)/2;
cnt[c[x]]++;
fenzi+= cnt[c[x]]*(cnt[c[x]]-1)/2;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
sqn=sqrt(n);
for(int i=1; i<=n; i++) {
cin>>c[i];
}
for(int i=1; i<=m; i++) {
int l,r;
cin>>l>>r;
ask[i]= {l,r,i};
}
sort(ask+1,ask+m+1,cmp);
int l=ask[1].l,r=ask[1].r;
fenmu=(r-l+1)*(r-l)/2;//概率的分子分母
if(fenmu==1)fenzi=0;
else {
for(int i=l; i<=r; i++) { //第一次暴力计算概率
cnt[c[i]]++;
}
for(int i=1; i<=n; i++) {
fenzi+=cnt[i]*(cnt[i]-1)/2;
}
}
ansfz[ask[1].pos]=fenzi;
ansfm[ask[1].pos]=fenmu;
for(int i=2; i<=m; i++) {
int newl=ask[i].l,newr=ask[i].r;
while(l<newl) { //l向后移
del(l);
++l;
}
while(l>newl) { //l向前移
--l;
add(l);
}
while(r<newr) { //r向后移
++r;
add(r);
}
while(r>newr) { //r向前移
del(r);
--r;
}
fenmu=(r-l+1)*(r-l)/2;//所有都要更新分母,所以干脆这里统一
ansfz[ask[i].pos]=fenzi;
ansfm[ask[i].pos]=fenmu;
}
for(int i=1; i<=m; i++) {
if(/*ansfz[i]==ansfm[i]*/ansfm[i]==0)cout<<"0/1\n";
else {
int g=__gcd(ansfz[i],ansfm[i]);
cout<< ansfz[i]/g<<"/"<<ansfm[i]/g<<'\n';
}
}
return 0;
}
Wrong Answer.wrong answer On line 2 column 4, read 2, expected 3.