Advertisement
Morass

13162

Nov 2nd, 2017
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<29)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef pair<ll,ll> pll;
  13. typedef vector<int> vi;
  14. typedef pair<int,int> ii;
  15. typedef vector<ii> vii;
  16. #define IN(n) int n;scanf("%d",&n);
  17. #define FOR(i, m, n) for (int i(m); i < n; i++)
  18. #define REP(i, n) FOR(i, 0, n)
  19. #define F(n) REP(i, n)
  20. #define FF(n) REP(j, n)
  21. #define FT(m, n) FOR(k, m, n)
  22. #define aa first
  23. #define bb second
  24. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  25. #define MX (60)
  26. #define DP (666)
  27. ll pt[MX][MX];
  28. void PT(){
  29.     F(MX){
  30.         pt[i][0]=pt[i][i]=1;
  31.         FT(1,i)pt[i][k]=pt[i-1][k]+pt[i-1][k-1];
  32.     }
  33. }
  34. set<int> S;
  35. bool   cn[11][11][11][DP];
  36. double dp[11][11][11][DP];
  37. int N,T,C,A,B,a;
  38. double dyn(int,int,int,int);
  39. double fm(int M,int K){return pt[M][K];}
  40. double rec(int A,int B,int C,int D,int R,int u,int r){
  41.     int t;
  42.     double S=0;
  43.     if(!u){
  44.         t=min(A,r)+1;
  45.         F(t)S+=fm(A,i)*rec(A-i,B,C,D,R,u+1,r-i);
  46.     }if(u==1){
  47.         t=min(B,r)+1;
  48.         F(t)S+=fm(B,i)*rec(A,B-i,C,D,R,u+1,r-i);
  49.     }if(u==2){
  50.         t=min(C,r)+1;
  51.         F(t)S+=fm(C,i)*rec(A,B,C-i,D,R,u+1,r-i);
  52.     }if(u==3){
  53.         if(r>R)return 0;
  54.         S=dyn(A,B,C,D)*pt[R][r]/pt[N][T];
  55.     }
  56.     return S;
  57. }
  58. double dyn(int A,int B,int C,int D){
  59.     if(!C&(!A|!B))return 0;
  60.     if(D==DP)return 0;
  61.     double&v=dp[A][B][C][D];
  62.     if(cn[A][B][C][D]++)return v;
  63.     return v=rec(A,B,C,D+1,N-A-B-C,0,T)+1;
  64. }
  65. int main(void){
  66.     PT();
  67.     while(~scanf("%d%d%d",&N,&T,&C)){
  68.         S.clear(),A=B=C,CL(cn,0);
  69.         F(C)scanf("%d",&a),S.insert(a);
  70.         F(C){
  71.             scanf("%d",&a);
  72.             if(S.count(a))--A,--B;
  73.         }
  74.         printf("%.12lf\n",dyn(A,B,C-A,0));
  75.     }
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement