結果

問題 No.301 サイコロで確率問題 (1)
ユーザー akakimidoriakakimidori
提出日時 2017-06-21 10:07:47
言語 C90
(gcc 11.4.0)
結果
AC  
実行時間 16 ms / 1,000 ms
コード長 1,191 bytes
コンパイル時間 517 ms
コンパイル使用メモリ 24,064 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-10-02 08:57:40
合計ジャッジ時間 1,217 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 14 ms
5,248 KB
testcase_01 AC 16 ms
5,248 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.c: In function ‘run’:
main.c:69:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   69 |   scanf("%d",&t);
      |   ^~~~~~~~~~~~~~
main.c:72:5: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   72 |     scanf("%lld",&n);
      |     ^~~~~~~~~~~~~~~~

ソースコード

diff #

#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