fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. long double I[4];
  8.  
  9. #define QC Q.begin(),Q.end(),cmp
  10.  
  11. typedef pair<long double,unsigned long long> pdi;
  12.  
  13. unsigned long long Factor[21];
  14.  
  15. bool cmp(pdi a,pdi b){
  16. return a.first > b.first;
  17. }
  18.  
  19. int main()
  20. {
  21. int N;
  22. cin >> N;
  23. Factor[0] = 1;
  24. for (int i=1;i<=20;i++)
  25. Factor[i] = Factor[i-1]*i;
  26. vector <pdi> Q;
  27. for (int i=0;i<4;i++)
  28. cin >> I[i];
  29. long double p1 = 1;
  30. for (int i=0;i<=N;i++){
  31. long double p2 = 1;
  32. for (int j=0;j<=N-i;j++){
  33. long double p3 = 1;
  34. for (int k=0;k<=N-i-j;k++){
  35. long double pp = p1*p2*p3;
  36. for (int z=0;z<N-i-j-k;z++)
  37. pp*=I[3];
  38. Q.push_back( pdi(pp, Factor[N]/Factor[i]/Factor[j]/Factor[k]/Factor[N-i-j-k] ) );
  39. p3*=I[2];
  40. }
  41. p2 *= I[1];
  42. }
  43. p1 *= I[0];
  44. }
  45. make_heap(QC);
  46. long double predval = 0;
  47. long double ans = 0;
  48. while (!Q.empty()){
  49.  
  50. pop_heap(QC);
  51. pdi PRED = Q[Q.size() - 1];
  52. Q.pop_back();
  53. if (predval){
  54. Q.push_back( pdi(predval + PRED.first ,1) );
  55. push_heap(QC);
  56. ans += predval + PRED.first;
  57. PRED.second --;
  58. }
  59. ans += (PRED.second/2*2+0.0) * PRED.first;
  60. if (PRED.second > 1){
  61. Q.push_back( pdi(2.0*PRED.first ,PRED.second/2) );
  62. push_heap(QC);
  63. }
  64. if (PRED.second & 1)
  65. predval = PRED.first;
  66. else predval = 0;
  67. }
  68. cout << ans;
  69. return 0;
  70. }
Success #stdin #stdout 0s 3280KB
stdin
Standard input is empty
stdout
Standard output is empty