AGC001E题解

我不会数学我不会数学我不会数学我不会数学我不会数学我不会数学我不会数学我不会数学我不会数学我不会数学我不会数学我不会数学我不会数学

下面的 \(b_i\) 表示原题面中的 \(a_i+b_i\)

\[\sum_{i=1}^{n}\sum_{j=1}^{n}\binom{b_i+b_j}{a_i+a_j} \]

\[\sum_{i=1}^{n}\sum_{j=1}^{n}(1+x)^{b_i+b_j}[x^{a_i+a_j}] \]

\[[x^0](\sum_{i=1}^{n}((1+x)^{b_i}x^{-a_i}))^2 \]

只需要考虑求出这个多项式即可。\((1+x)^{b_i}\) 更麻烦一些所以枚举 \(b_i\)

\[\sum_{i=0}^{4000}(\sum_{b_k=i}x^{-a_k})(1+x)^i \]

位移一下之后即可使用秦九韶算法计算,若 \(m=4000\) 则复杂度为 \(O(n+m^2)\)

#include<cstdio>
#include<cctype>
const int M=2005,mod=1e9+7;
int n,ege,h[M<<1],fac[M<<2],ifac[M<<2],F[M<<2];struct Node{int a,nx;}t[M*100];
inline int C(const int&n,const int&m){return 1ll*ifac[m]*ifac[n-m]%mod*fac[n]%mod;}
inline int read(){int n(0);char s;while(!isdigit(s=getchar()));while(n=n*10+(s&15),isdigit(s=getchar()));return n;}
signed main(){
	int ans(0);n=read();fac[0]=fac[1]=ifac[0]=ifac[1]=1;
	for(int i=2;i<=8000;++i)ifac[i]=1ll*(mod-mod/i)*ifac[mod%i]%mod;
	for(int i=1;i<=8000;++i)fac[i]=1ll*fac[i-1]*i%mod,ifac[i]=1ll*ifac[i-1]*ifac[i]%mod;
	for(int x,y,i=1;i<=n;++i)x=read(),y=read(),t[++ege]=(Node){2000-x,h[x+y]},h[x+y]=ege,ans=(ans+mod-C(x+y<<1,x<<1))%mod;
	for(int i=4000;i>=0;--i){
		for(int k=8000;k>=1;--k)F[k]=(F[k]+F[k-1])%mod;for(int E=h[i];E;E=t[E].nx)++F[t[E].a]%=mod;
	}
	for(int i=0;i<=4000;++i)ans=(ans+1ll*F[i]*F[4000-i])%mod;printf("%d",1ll*ans*(mod+1>>1)%mod);
}
posted @ 2022-07-30 10:21  Prean  阅读(17)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};