rt,代码已AC,但必须把代码里的int换成long long(参与答案运算的变量我开了long long,int的是后来宏定义上的,不这么做过不了,想知道为什么qwq)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+10;
int n,m,t,c[N];
long long ans,num[N];
pair<long long,long long> hd[N];
struct jgt
{
int l,r,id;
}q[N];
bool cmp(jgt x,jgt y)
{
if(x.l/t!=y.l/t)
return x.l<y.l;
if((x.l/t)&1)
return x.r<y.r;
return x.r>y.r;
}
long long gcd(long long a,long long b)
{
if(!b)
return a;
return gcd(b,a%b);
}
void xg(int x,int k)
{
ans-=num[c[x]]*(num[c[x]]-1)/2;
num[c[x]]+=k;
ans+=num[c[x]]*(num[c[x]]-1)/2;
}
void solve()
{
int L=1,R=0;
for(int i=1;i<=m;i++)
{
while(L<q[i].l) xg(L++,-1);
while(L>q[i].l) xg(--L,1);
while(R<q[i].r) xg(++R,1);
while(R>q[i].r) xg(R--,-1);
if(q[i].l==q[i].r)
hd[q[i].id]={0,1};
else
{
long long zfa=(q[i].r-q[i].l+1)*(q[i].r-q[i].l)/2,gy=gcd(ans,zfa);
hd[q[i].id]={ans/gy,zfa/gy};
}
}
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&c[i]);
for(int i=1;i<=m;i++)
scanf("%lld%lld",&q[i].l,&q[i].r),q[i].id=i;
t=sqrt(n);
sort(q+1,q+m+1,cmp);
solve();
for(int i=1;i<=m;i++)
printf("%lld/%lld\n",hd[i].first,hd[i].second);
return 0;
}