1. 程式人生 > 實用技巧 >HDU6814:Set1——題解

HDU6814:Set1——題解

http://acm.hdu.edu.cn/showproblem.php?pid=6825

給你一個集合$S=\{1..n\}$。保證 $n$ 是奇數。必須執行以下操作,直到集合中只有一個元素:

首先刪除 $S$ 的最小元素,然後從 $S$ 中隨機刪除另一個元素。

對於每個 $i∈[1,n]$ ,確定 $i$ 留在 $S$ 中的概率。

emm題解u1s1很好看懂,但打的時候我反正是矇蔽的,然後就打表做的。打表也不難,講講怎麼打的表。

設 $f[i][j]$ 為有 $j$ 個元素的集合裡第i個元素存活概率。

顯然 $f[i][j]=((j-i)*f[i-1][j-2]+(i-2)*f[i-2][j-2])/(j-1)$ 。

然後意識到除 $j-1$ 這塊打表用不到,於是扔掉 $j-1$ 開始打表。

然後發現驚天大祕密(

當 $n$ 為 $1,3,5,7,9$ 時,有:

1
0 1 1
0 0 2 3 3
0 0 0 6 12 15 15
0 0 0 0 24 60 90 105 105

首先就是每行最後兩個數相同,且都為 $(n-2)!!$ 。

其次通過表可以發現 $f[i][j]=f[i-1][j-2]*(i-1)$ ,並且如果這個式子不斷地遞迴下去的話,要麼為 $0$ ,要麼得到的式子裡的 $f$ 的兩維的數是一樣的。

於是對於給定的詢問 $n$ 個元素當中第 $x$ 個元素存活概率,有如下演算法:

1.如果 $2*x-n-1<0$ ,則答案為 $0$ 。

2.否則,答案為 $(x-1)!/(2*x-n-1)!*f[2*x-n][2*x-n]$ ,而 $f[2*x-n][2*x-n]=(2*x-n-2)!!$ (當然你需要為 $2*x-n=1$ 進行特判)

最後的答案不要忘記把我們之前拋掉的除 $j-1$ 加回來,其實利用一開始的dp式子可以知道實際上答案只需要多除一個 $(n-1)!!$ 即可。

#include<bits/stdc++.h>
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
const ll p=998244353; const int N=5e6+5; inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch=='-';ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X; } void write(ll x){ if(x<0)putchar('-'),x=-x; if(x>9)write(x/10); putchar(x%10+'0'); } ll inv[N],JJ[N],J[N]; inline ll getequ(int x){ if(x==1)return 1; return JJ[x-2]; } ll qpow(ll k,int n){ ll res=1; while(n){ if(n&1)res=res*k%p; k=k*k%p;n>>=1; } return res; } ll sol(int x,int n){ int del=n-x; if(x-del-1<0)return 0; ll ans=J[x-1]*qpow(J[x-del-1],p-2)%p; return ans*getequ(x-del)%p; } void init(){ inv[0]=inv[1]=1;J[0]=J[1]=JJ[1]=1; for(int i=2;i<N;i++){ J[i]=J[i-1]*i%p; inv[i]=(p-p/i)*inv[p%i]%p; } for(int i=2;i<N;i+=2){ inv[i]=inv[i]*inv[i-2]%p; } for(int i=3;i<N;i+=2){ JJ[i]=JJ[i-2]*i%p; } } int main(){ init(); int T=read(); while(T--){ int n=read(); for(int i=1;i<=n;i++){ write(sol(i,n)*inv[n-1]%p); if(i!=n)space; } enter; } return 0; }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的部落格:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++