Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define PB push_back
- #define ZERO (1e-10)
- #define INF (1<<29)
- #define CL(A,I) (memset(A,I,sizeof(A)))
- #define DEB printf("DEB!\n");
- #define D(X) cout<<" "<<#X": "<<X<<endl;
- #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
- typedef long long ll;
- typedef long double ld;
- typedef pair<ll,ll> pll;
- typedef vector<int> vi;
- typedef pair<int,int> ii;
- typedef vector<ii> vii;
- #define IN(n) int n;scanf("%d",&n);
- #define FOR(i, m, n) for (int i(m); i < n; i++)
- #define REP(i, n) FOR(i, 0, n)
- #define F(n) REP(i, n)
- #define FF(n) REP(j, n)
- #define FT(m, n) FOR(k, m, n)
- #define aa first
- #define bb second
- void ga(int N,int *A){F(N)scanf("%d",A+i);}
- #define MX (60)
- #define DP (666)
- ll pt[MX][MX];
- void PT(){
- F(MX){
- pt[i][0]=pt[i][i]=1;
- FT(1,i)pt[i][k]=pt[i-1][k]+pt[i-1][k-1];
- }
- }
- set<int> S;
- bool cn[11][11][11][DP];
- double dp[11][11][11][DP];
- int N,T,C,A,B,a;
- double dyn(int,int,int,int);
- double fm(int M,int K){return pt[M][K];}
- double rec(int A,int B,int C,int D,int R,int u,int r){
- int t;
- double S=0;
- if(!u){
- t=min(A,r)+1;
- F(t)S+=fm(A,i)*rec(A-i,B,C,D,R,u+1,r-i);
- }if(u==1){
- t=min(B,r)+1;
- F(t)S+=fm(B,i)*rec(A,B-i,C,D,R,u+1,r-i);
- }if(u==2){
- t=min(C,r)+1;
- F(t)S+=fm(C,i)*rec(A,B,C-i,D,R,u+1,r-i);
- }if(u==3){
- if(r>R)return 0;
- S=dyn(A,B,C,D)*pt[R][r]/pt[N][T];
- }
- return S;
- }
- double dyn(int A,int B,int C,int D){
- if(!C&(!A|!B))return 0;
- if(D==DP)return 0;
- double&v=dp[A][B][C][D];
- if(cn[A][B][C][D]++)return v;
- return v=rec(A,B,C,D+1,N-A-B-C,0,T)+1;
- }
- int main(void){
- PT();
- while(~scanf("%d%d%d",&N,&T,&C)){
- S.clear(),A=B=C,CL(cn,0);
- F(C)scanf("%d",&a),S.insert(a);
- F(C){
- scanf("%d",&a);
- if(S.count(a))--A,--B;
- }
- printf("%.12lf\n",dyn(A,B,C-A,0));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement