HDU多校第五场--1012/6825 SET1(组合数+概率
题意:http://acm.hdu.edu.cn/showproblem.php?pid=6825
每次选出最小数删除,并任选一个数删除,问 i 球可以留下的概率
思路:
大概是这个意思
1 ll inv(ll b){return b==1||b==0?1:(mod-mod/b)*inv(mod%b)%mod;} 2 ll f[N]; 3 ll C(ll n,ll m){ 4 return f[n]*inv(f[m])%mod*inv(f[n-m])%mod; 5 } 6 void init() 7 { 8 f[0]=1; 9 for(int i=1;i<N;i++) 10 f[i]=f[i-1]*i%mod; 11 } 12 13 int _[N],er[N],__[N]; 14 15 ll qpow(ll a,ll b,ll mod) 16 { 17 ll ans; 18 // a%=mod; 19 ans=1; 20 while(b!=0) 21 { 22 if(b&1) 23 ans=(ans*a)%mod; 24 b/=2; 25 a=(a*a)%mod; 26 } 27 return ans; 28 } 29 30 void solve() 31 { 32 int n; 33 sc("%lld",&n); 34 for(int i=1;i<=n/2;++i)pr("0%c"," \n"[i==n]); 35 pr("%lld%c",_[n/2]*qpow(__[n/2],mod-2,mod)%mod," \n"[n==1]); 36 for(int i=n/2+2;i<=n;++i) 37 { 38 int x=i-1; 39 int y=n-i; 40 int k=(x-y)/2; 41 pr("%lld%c",_[2*k]*C(x,y)%mod*_[y]%mod*qpow(er[k]*_[k]%mod,mod-2,mod)%mod*qpow(__[n/2],mod-2,mod)%mod," \n"[i==n]); 42 } 43 } 44 45 signed main() 46 { 47 init(); 48 _[0]=1; 49 er[0]=1; 50 __[0]=1; 51 int tt=0; 52 for(int i=1;i<N;++i) 53 tt+=2,_[i]=_[i-1]*i%mod,er[i]=er[i-1]*2%mod,__[i]=__[i-1]*tt%mod; 54 // cout<<3*qpow(8,mod-2,mod)%mod<<endl; 55 int T; 56 sc("%lld",&T); 57 while(T--)solve(); 58 return 0; 59 }