Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cmath> #include<string> #include<queue> #include<algorithm> #include<stack> #include<cstring> #include<vector> #include<list> #include<set> #include<map> using namespace std; #define ll long long #define pi (4*atan(1.0)) #define mk make_pair #define eps 1e-7 #define bug(x) cout<<"bug"<<x<<endl; const int N=3e4+10,M=4e6+10,inf=2147483647; const ll INF=1e18+10,mod=1000000007; /// 数组大小 int pos[N]; struct is { int l,r,now; bool operator < (const is &a)const { if(pos[l]!=pos[a.l]) return pos[l]<pos[a.l]; return r<a.r; } } s[N]; int a[N]; ll flag[N],ans,out[N],si; ll quick_pow(ll x,ll p) { if(!p) return 1; ll ans = quick_pow(x,p>>1); ans = ans*ans%mod; if(p & 1) ans = ans*x%mod; return ans; } ll inv[N]; void add(int x) { si++; flag[a[x]]++; if(si<=0)return; ans=(ans*si)%mod; ans=(ans*inv[flag[a[x]]])%mod; } void del(int x) { if(si>0)ans=(ans*inv[si])%mod,ans=(ans*flag[a[x]])%mod; flag[a[x]]--; si--; } void xjhz() { inv[1] = 1; for (int i=2; i<=30000; ++i) { inv[i] = (mod - mod / i) * inv[mod%i] % mod; } } void init() { ans=1; si=0; memset(flag,0,sizeof(flag)); } int main() { xjhz(); int T; scanf("%d",&T); while(T--) { init(); int n,q; scanf("%d%d",&n,&q); int k=sqrt(n); for(int i=1; i<=n; i++) scanf("%d",&a[i]),pos[i]=(i-1)/k+1; for(int i=1; i<=q; i++) scanf("%d%d",&s[i].l,&s[i].r),s[i].now=i; sort(s+1,s+1+q); int L=1,R=0; for(int i=1; i<=q; i++) { while(L<s[i].l) { del(L); L++; } while(L>s[i].l) { L--; add(L); } while(R>s[i].r) { del(R); R--; } while(R<s[i].r) { R++; add(R); } out[s[i].now]=ans; } for(int i=1; i<=q; i++) printf("%lld\n",out[i]); } return 0; }
原文:http://www.cnblogs.com/jhz033/p/6701620.html