結果
| 問題 | No.302 サイコロで確率問題 (2) |
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-04-18 19:15:10 |
| 言語 | C90 (gcc 15.2.0) |
| 結果 |
CE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,336 bytes |
| 記録 | |
| コンパイル時間 | 126 ms |
| コンパイル使用メモリ | 28,636 KB |
| 最終ジャッジ日時 | 2026-02-24 00:57:22 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
main.c:11:1: error: C++ style comments are not allowed in ISO C90
11 | //n<=l, r<=6*n
| ^
main.c:11:1: note: (this will be reported only once per input file)
ソースコード
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef long long int int64;
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define ABS(a) ((a)>(0)?(a):-(a))
//n<=l, r<=6*n
void solveSmall(int n,int l,int r){
double *now=(double *)malloc(sizeof(double)*(r+1));
double *next=(double *)malloc(sizeof(double)*(r+1));
now[0]=1;
const double p=(double)1/6;
int i,j,k;
for(i=1;i<=n;i++){
for(j=i;j<=MIN(6*i,r);j++) next[j]=0;
for(j=i-1;j<=MIN(6*(i-1),r);j++){
for(k=1;k<=6 && k<=r-j;k++){
next[j+k]+=now[j];
}
}
for(j=i;j<=MIN(6*i,r);j++) next[j]*=p;
double *swap=now;
now=next;
next=swap;
}
double sum=0;
for(i=l;i<=r;i++) sum+=now[i];
printf("%.9lf\n",sum);
free(now);
free(next);
return;
}
void solveLarge(int64 n,int64 l,int64 r){
double e=3.5*n;
double v=n*(double)35/12;
double sqv=sqrt(v);
double ll=(l-0.5-e)/sqv;
double rr=(r-0.5-e)/sqv;
double p=(erf(rr/sqrt(2))-erf(ll/sqrt(2)))/2;
printf("%.9lf\n",p);
return;
}
void run(void){
int64 n;
scanf("%lld",&n);
int64 l,r;
scanf("%lld%lld",&l,&r);
if(l>6*n || r<n){
printf("0\n");
return;
}
if(n<=16000){
solveSmall((int)n,(int)MAX(l,n),(int)MIN(6*n,r));
return;
}
solveLarge(n,l,r);
return;
}
int main(void){
run();
return 0;
}
akakimidori