https://www.luogu.org/problemnew/show/P1494
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
ll a[50010]={0};
ll vis[50010]={0};
ll block,sum=0;
struct node
{
ll l,r;
ll id;
}b[50010];
struct n
{
ll w,t;
}ans[50010];
bool cmp(node p,node q)
{
if(p.l/block==q.l/block)
return p.r<q.r;
else
return p.l<q.l;
}
void add(ll x)
{
vis[a[x]]++;
if(vis[a[x]]>=2)
sum+=2*(vis[a[x]]-1);
}
void del(ll x)
{
vis[a[x]]--;
if(vis[a[x]]>=1)
sum-=2*vis[a[x]];
}
ll gcd(ll x,ll y)
{
ll r;
while(y)
{
r=x%y;
x=y;
y=r;
}
return x;
}
int main()
{
ll n,m;
scanf("%lld %lld",&n,&m);
for(ll i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(ll i=1;i<=m;i++)
{
scanf("%lld %lld",&b[i].l,&b[i].r);
b[i].id=i;
}
block=sqrt(n);
sort(b+1,b+m+1,cmp);
ll tl=1,tr=0;
for(ll i=1;i<=m;i++)
{
if(b[i].l==b[i].r)
{
ans[b[i].id].w=0;
ans[b[i].id].t=1;
continue;
}
while(tl<b[i].l)
del(tl++);
while(tl>b[i].l)
add(--tl);
while(tr<b[i].r)
add(++tr);
while(tr>b[i].r)
del(tr--);
ll pp=(b[i].r-b[i].l+1)*(b[i].r-b[i].l);
ll ss=gcd(pp,sum);
ans[b[i].id].w=sum/ss,ans[b[i].id].t=pp/ss;
}
for(ll i=1;i<=m;i++)
printf("%lld/%lld\n",ans[i].w,ans[i].t);
return 0;
}