#pragma GCC optimize("Ofast") #pragma GCC target("avx2") #define getrp() ({char*mmap();mmap(0l,1l<<25,1,2,0,0ll);}) #define rd() ({long _v=0,_c;while(_c=*rp++-48,_c>=0)_v=_v*10+_c;_v;}) #define wt(v) ({ulong _z=v;do*--wp=_z%10+48;while(_z/=10);}) #define rep(v,e) for(long v=0;v>1)%MD; } } void radix_sort_aux(ulong*a,ulong*b,long n,int ph){ int c[512]; for(long i=0;i<512;++i){ c[i]=0; } for(long i=0;i>9|a[i]<<55; } }else if(ph==1){ for(long i=0;i>18|a[i]<<46; } }else if(ph==2){ for(long i=0;i>37|a[i]<<27; } } } ulong q0[200000],q1[200000]; int r[200000]; char wbuf[1<<25]; void f0(){ mkfac(); mkp2(); } long f1(){ char*rp=getrp(); long t=rd(); rep(i,t){ long n=rd()-1; long m=rd()-1; q0[i]=i<<36|n<<18|m; } return t; } void f2(long t){ radix_sort_aux(q0,q1,t,0); radix_sort_aux(q1,q0,t,1); radix_sort_aux(q0,q1,t,2); } long f3(long t){ long b=0,c=0; ulong z=1; rep(i,t){ long j=q1[i]>>36; long e=q1[i]>>18&0x3ffff; long f=q1[i]&0x3ffff; if(fe){ --b; d=(d*(MD+1>>1)+1ul*fac[b]*ifac[b-c])%MD; } z=(z+d*ifac[c]%MD*ip2[b+1])%MD; } { long d=0; while(c