7,8,9 交了几发都T了,求教大佬/dk
#include <bits/stdc++.h>
using namespace std;
#define ll long long
inline ll read()
{
char ch;
ll x=0,f=1;
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-1;
for(; isdigit(ch);ch=getchar())
x*=10,x+=(ch-'0');
return x*f;
}
int n,sq;
int a[50005];
int Q;
struct QAQ{
ll l;
ll r;
int id;
}q[50005];
QAQ qq[50005];
bool comp(QAQ x,QAQ y)
{
int xl=x.l/sq,yl=x.l/sq;
if(xl!=yl) return xl<yl;
return x.r<y.r;
}
ll cnt[50005],cur,l=1,r;
ll ans[50005];
inline void add(int p)
{
cnt[a[p]]++;
cur+=2*(cnt[a[p]]-1);
}
inline void del(int p)
{
cur-=2*(cnt[a[p]]-1);
cnt[a[p]]--;
}
inline ll gcd(ll x,ll y)
{
return !y?x:gcd(y,x%y);
}
int main()
{
n=read();
Q=read();
sq=sqrt(n);
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=Q;i++)
{
q[i].l=read();
q[i].r=read();
q[i].id=i;
qq[i].l=q[i].l;
qq[i].r=q[i].r;
qq[i].id=i;
}
sort(q+1,q+Q+1,comp);
for(int i=1;i<=Q;i++)
{
while(l>q[i].l) add(--l);
while(r<q[i].r) add(++r);
while(l<q[i].l) del(l++);
while(r>q[i].r) del(r--);
ans[q[i].id]=cur;
}
for(int i=1;i<=Q;i++)
{
if(qq[i].r==qq[i].l||ans[i]==0)
{
printf("0/1\n");
continue;
}
ll t=qq[i].r-qq[i].l+1;
t=t*(t-1);
ll p=gcd(ans[i],t);
printf("%lld/%lld\n",ans[i]/p,t/p);
}
return 0;
}