记录编号 462708 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2012]Contra 最终得分 100
用户昵称 GravatarBaDBoY 是否通过 通过
代码语言 C++ 运行时间 5.648 s
提交时间 2017-10-22 21:12:11 内存使用 0.63 MiB
显示代码纯文本
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. #define eps 1e-15
  7. int n,r,q,mx;
  8. double s;
  9. struct matrix {
  10. double M[105][105];
  11. matrix() {memset(M,0,sizeof(M));}
  12. friend matrix operator * (matrix a1,matrix a2) {
  13. matrix res;
  14. for(int i=1; i<=mx; ++i) {
  15. for(int j=1; j<=mx; ++j) {
  16. if(a1.M[i][j]<eps)continue;
  17. for(int k=1; k<=mx; ++k) {
  18. if(a2.M[j][k]<eps)continue;
  19. res.M[i][k]+=a1.M[i][j]*a2.M[j][k];
  20. }
  21. }
  22. } return res;
  23. }
  24. };
  25. matrix qpow(matrix a,int t) {
  26. matrix res;
  27. for(int i=1; i<=mx; ++i)res.M[i][i]=1.0;
  28. for( ; t; t>>=1,a=a*a) if(t&1) res=res*a;
  29. return res;
  30. }
  31. int id[101][101],ID;
  32. bool check(double p) {
  33. matrix ans;
  34. ans.M[ID][ID]=1.0;
  35. for(int i=1; i<=q; ++i)
  36. for(int j=1; j<=r; ++j) {
  37. ans.M[ID][id[i][j]]+=p*j;
  38. if(i<q&&j<r)ans.M[id[i+1][j+1]][id[i][j]]+=p;
  39. else if(i<q)ans.M[id[i+1][j]][id[i][j]]+=p;
  40. else if(j<r)ans.M[id[i][j+1]][id[i][j]]+=p;
  41. else ans.M[id[i][j]][id[i][j]]+=p;
  42. if(i>1) ans.M[id[i-1][1]][id[i][j]]+=1.0-p;
  43. }
  44. ans=qpow(ans,n);
  45. return ans.M[ID][id[q][1]]>s;
  46. }
  47. bool Main() {
  48. freopen("nt2012_contra.in","r",stdin);
  49. freopen("nt2012_contra.out","w",stdout);
  50. scanf("%d%d%d%lf",&n,&r,&q,&s);
  51. for(int i=1; i<=q; ++i) for(int j=1; j<=r; ++j) id[i][j]=++ID;
  52. mx=++ID;
  53. if(!check(1.0)) {printf("Impossible.");return 0;}
  54. double l=0,r=1.0,ans=0.0;
  55. int cnt=0;
  56. while(cnt++<30) {
  57. double mid=(l+r)/2.0;
  58. if(check(mid)) ans=mid,r=mid;
  59. else l=mid;
  60. }
  61. printf("%0.6lf",ans);
  62. return 0;
  63. }
  64. bool hh=Main();
  65. int main(){;}