結果
| 問題 |
No.58 イカサマなサイコロ
|
| コンテスト | |
| ユーザー |
tsuishi
|
| 提出日時 | 2021-04-16 15:49:56 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1 ms / 5,000 ms |
| コード長 | 4,043 bytes |
| コンパイル時間 | 1,048 ms |
| コンパイル使用メモリ | 31,872 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-02 16:15:18 |
| 合計ジャッジ時間 | 1,647 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
extern int getchar_unlocked(void);
extern int putchar_unlocked(int);
#define DEBUGe
// ---------------------------
#define NOP do{}while(0)
#define gc(d) (d)=getchar_unlocked()
#define pc(d) putchar_unlocked(d)
#define mygc(c) (c)=getchar()
#define PRINCR pc('\n')
#ifdef DEBUG
#include <time.h>
#define TRACE(...) do{fprintf(stderr,__VA_ARGS__);}while(0)
#define TRACECR do{fprintf(stderr,"\n");}while(0)
static clock_t startclock;
void DEBUGSTART(void){TRACE("--DEBUG MODE --\n");startclock=clock();}
void DEBUGEND(void){startclock=clock()-startclock;TRACE("--finish --\ntime is %.3fms\n",startclock/1000.);}
#else
#define TRACE(...) NOP
#define TRACECR NOP
void DEBUGSTART(void){return;}
void DEBUGEND(void){return;}
#endif
// ---------------------------
#define NOCR(strig) do{char *p;p=strchr(strig,'\n');if(p)*p='\0';}while(0)
#define SWAP(type,a,b) do{type _c;_c=a;a=b;b=_c;}while(0)
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MID(a,b,c) ((a)>(b)?(b)>(c)?(b):(a)>(c)?(c):(a):(c)>(b)?(b):(c)>(a)?(c):(a))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define REP(a,b) for(int a=0;a<(int)(b);++a)
#define REP1(a,b) for(int a=1;a<=(int)(b);++a)
#define ll long long
#define INPUT GETLINE
#define ull unsigned ll
#define ui unsigned int
static char *GETWORD(char* str) {char c;char *cp;cp=&str[0];gc(c);while(c!=EOF){if((c==' ')||(c=='\n'))break;*cp++=c;gc(c);}*cp='\0';return &str[0];}
#define GETLINE(str) do{char *p;fgets(str,sizeof(str),stdin);p=strchr(str,'\n');if(p)*p='\0';}while(0)
#define REP(a,b) for(int a=0;a<(int)(b);++a)
static int GETLINEINT(void) {char s[34];GETLINE(s);return atoi(s);}
static int GETWORDINT(void) {char s[34];GETWORD(s);return atoi(s);}
static ll GETWORDLL(void) {char s[34];GETWORD(s);return atoll(s);}
static long GETLINELONG(void) {char s[34];GETLINE(s);return atol(s);}
static ll GETLINELL(void) {char s[34];GETLINE(s);return atoll(s);}
static int cmpint123(const void *a,const void *b){if(*(int *)a>*(int *)b){return 1;}if(*(int *)a==*(int *)b){return 0;}return -1;}
static int cmpint321(const void *a,const void *b){if(*(int *)a<*(int *)b){return 1;}if(*(int *)a==*(int *)b){return 0;}return -1;}
static ll midll(ll a,ll b,ll c){if(a>b){if(b>c){return b;}else if(a>c){return c;}
else{return a;}}else{if(c>b){return b;}else if(c>a){return c;}else{return a;}}}
static int gcd(int a,int b){int c;while(b!=0){c=a%b;a=b;b=c;}return a;} // 最大公約数
static ll gcdll(ll a,ll b){ll c;while(b!=0){c=a%b;a=b;b=c;}return a;} // 最大公約数
#define Yes(a) printf("%s\n",((a)?"Yes":"No"))
// ---------------------------
// グローバル変数
// [1][0] = 15/36;
// [1][1] = 24/36;
#define DMAX (6*10)
int N,K;
ll win = 0;
double wk[(DMAX+12)];
double dp123456[(DMAX+12)];
double dp445566[(DMAX+12)];
// ---------------------------
void read(void)
{
N = GETLINEINT();
K = GETLINEINT();
}
void init(void)
{
REP1(i,DMAX) dp123456[i] = 0.;
REP1(i,DMAX) dp445566[i] = 0.;
}
// *********************
int main( void )
{
double ans = 0;
init();
read();
DEBUGSTART();
TRACE("N%2d,K%2d\n",N,K);
dp123456[0] = 1.;
REP(m,N) {
REP(i,DMAX) wk[i] = 0.;
for(int k = 0; k <= DMAX-6 ; k++) {
double pls = dp123456[k]/6.;
REP1(i,6) {
wk[k+i] += pls;
}
}
memcpy( dp123456, wk , sizeof(wk[0]) * (DMAX+12) );
}
REP1(m,13) TRACE("%2d-%.9f\n",m,dp123456[m]);
dp123456[0] = 0.;
dp445566[0] = 1.;
REP(m,K) {
REP(i,DMAX) wk[i] = 0.;
for(int k = 0; k <= DMAX-6 ; k++) {
double pls = dp445566[k]/3.;
for(int i=4; i<=6;i++) {
wk[k+i] += pls;
}
}
memcpy( dp445566, wk , sizeof(wk[0]) * (DMAX+12) );
}
REP(m,N-K) {
REP(i,DMAX) wk[i] = 0.;
for(int k = 0; k <= DMAX-6 ; k++) {
double pls = dp445566[k]/6.;
REP1(i,6) {
wk[k+i] += pls;
}
}
memcpy( dp445566, wk , sizeof(wk[0]) * (DMAX+12) );
}
dp445566[0] = 0.;
REP1(m,37) TRACE("%2d-%.9f\n",m,dp445566[m]);
REP(i,DMAX) for(int k=i+1; k <= DMAX;k++) ans += dp123456[i] * dp445566[k];
printf("%.15f\n",ans );
DEBUGEND();
}
tsuishi