結果

問題 No.301 サイコロで確率問題 (1)
コンテスト
ユーザー akakimidori
提出日時 2017-06-21 10:07:47
言語 C90(gcc15)
(gcc 15.2.0)
コンパイル:
gcc-15 -O2 -std=c90 -DONLINE_JUDGE -o a.out _filename_ -lm
実行:
./a.out
結果
AC  
実行時間 15 ms / 1,000 ms
コード長 1,191 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 197 ms
コンパイル使用メモリ 40,032 KB
最終ジャッジ日時 2026-02-24 00:43:57
ジャッジサーバーID
(参考情報)
judge2 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 2
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include<stdio.h>
#include<stdlib.h>

#define ABS(a) ((a)>=0?(a):-(a))

void test(void){

  int k=1;
  while(1){
    double c[1000];
    double v[1000];
    int i;
    for(i=k+1;i<=k+5;i++){
      c[i]=0.0;
      v[i]=1.0;
    }
    c[k]=v[k]=0.0;
    
    for(i=k-1;i>=0;i--){
      c[i]=1.0;
      v[i]=0.0;
      const double f=(double)1/6;
      int j;
      for(j=1;j<=6;j++){
	c[i]+=c[i+j]*f;
	v[i]+=v[i+j]*f;
      }
    }
    double ans=c[0]/(1.0-v[0]);
    double e=k+(double)5/3;
    if(ABS(ans-e)/ans<1e-12){
      printf("%d\n",k);
      break;
    }
    k++;
  }

  return;
}

double calc(long long int n){
  if(n>=100) return n+(double)5/3;

  int k=(int)n;
  double c[105];
  double v[105];
  int i;
  for(i=k+1;i<=k+5;i++){
    c[i]=0.0;
    v[i]=1.0;
  }
  c[k]=v[k]=0.0;
  
  for(i=k-1;i>=0;i--){
    c[i]=1.0;
    v[i]=0.0;
    const double f=(double)1/6;
    int j;
    for(j=1;j<=6;j++){
      c[i]+=c[i+j]*f;
      v[i]+=v[i+j]*f;
      }
  }
  return c[0]/(1.0-v[0]);
}

void run(void){
  int t;
  scanf("%d",&t);
  while(t>0){
    long long int n;
    scanf("%lld",&n);
    printf("%.13lf\n",calc(n));
    t--;
  }
  return;
}

int main(void){
  run();
  return 0;
}
0