题目链接:小z的袜子
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=5e4+7;
ll cnt[maxn],fz[maxn],fm[maxn],Ans;
int L=1,R;
int pos[maxn];
int c[maxn];
struct Query
{
int l,r,id;
bool operator < (const Query & b) const
{
return pos[l]<pos[b.l]||(pos[l]==pos[b.l]&&r<b.r);
}
};
Query Q[maxn];
ll gcd(ll a,ll b)
{
return a%b?gcd(b,a%b):b;
}
void add(int x)
{
ll& k=cnt[c[x]];
Ans-=k*k;
++k;
Ans+=k*k-1;
}
void del(int x)
{
ll& k=cnt[c[x]];
Ans-=k*k;
--k;
Ans+=k*k+1;
}
int main()
{
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
int sz=sqrt(n);
for(int i=1;i<=n;i++)
{
cin>>c[i];
pos[i]=i/sz;
}
for(int i=1;i<=m;i++)
{
cin>>Q[i].l>>Q[i].r;
Q[i].id=i;
}
sort(Q+1,Q+m+1);
for(int i=1;i<=m;i++)
{
while(L<Q[i].l)
{
del(L);
L++;
}
while(L>Q[i].l)
{
L--;
add(L);
}
while(R<Q[i].r)
{
++R;
add(R);
}
while(R>Q[i].r)
{
del(R);
--R;
}
fz[Q[i].id]=Ans;
fm[Q[i].id]=1LL*(R-L+1)*(R-L);
ll k=gcd(fz[Q[i].id],fm[Q[i].id]);
fz[Q[i].id]/=k;
fm[Q[i].id]/=k;
}
for(int i=1;i<=m;i++)
cout << fz[i] << "/" << fm[i] << endl;
return 0;
}