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"," 
"[i==n]);
35     pr("%lld%c",_[n/2]*qpow(__[n/2],mod-2,mod)%mod," 
"[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," 
"[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 }
原文地址:https://www.cnblogs.com/--HPY-7m/p/13435226.html