短码练习

不是变态短码..不是那种1k-紫荆花之恋..

// cf722E 969B
#include<cstdio>
#include<algorithm>
const int P=1000000007,N=200200;
typedef long long ll;
ll p(int a,int e=P-2,ll t=1){for(;e;e>>=1,a=ll(a)*a%P)if(e&1)t=t*a%P;return t;}
int F[N]={1,1},iF[N],n,m,g,s,f[22][N],c;
ll C(int n,int m){return ll(F[n])*iF[m]%P*iF[n-m]%P;}
struct J{int x,y;}Q[N];bool z(J a,J b){return a.x+a.y<b.x+b.y;}
ll G(J a,J b){return b.x>=a.x&&b.y>=a.y?C(b.x+b.y-a.x-a.y,b.x-a.x):0ll;}
ll G(J a){return C(n+m-a.x-a.y,n-a.x);}
int main(){
	ll i=2,o=0;
	for(;i<N;++i)
		F[i]=i*F[i-1]%P;
	iF[N-1]=p(F[N-1]);
	for(i=N-1;i;--i)
		iF[i-1]=iF[i]*i%P;
	scanf("%d%d%d%d",&n,&m,&g,&c);
	for(int u,v;i<g;++i)
		scanf("%d%d",&u,&v),Q[i]=(J){u,v};
	Q[g]=(J){1,1};std::sort(Q,Q+g+1,z);
	for(int l=1,*v;l<22;++l){v=f[l];
		for(i=g;~i;--i){
			ll z=G(Q[i]);
			for(int j=i+1;j<=g;++j)
				z=(z-G(Q[i],Q[j])*v[j])%P+P;
			i[*f]=(i[*f]+(v[i]=((z-i[*f])%P+P)%P))%P;
		}o=(o+c*ll(*v))%P,c=(c-1)/2+1;
	}o=(o+(G(*Q)-**f)%P+P)%P;
	printf("%lld\n",o*p(G(*Q))%P);
	return 0;
}
posted @ 2016-10-22 23:34  zball  阅读(365)  评论(0编辑  收藏  举报