結果
| 問題 |
No.302 サイコロで確率問題 (2)
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2018-04-18 19:08:28 |
| 言語 | C90 (gcc 12.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,295 bytes |
| コンパイル時間 | 371 ms |
| コンパイル使用メモリ | 25,984 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-06-27 04:32:02 |
| 合計ジャッジ時間 | 6,472 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 19 WA * 1 |
コンパイルメッセージ
main.c: In function ‘run’:
main.c:50:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
50 | scanf("%lld",&n);
| ^~~~~~~~~~~~~~~~
main.c:52:3: warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
52 | scanf("%lld%lld",&l,&r);
| ^~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#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]*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<=15000){
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