優勝者プログラム(by 池辺 貞郎,梅津 高朗(六甲高等学校)) (注)石の重さなどの桁数が大きいのでそのままでは普通の計算機では動 かないかもしれない. #include #include #define IN 40 石の総数 #define UPPER 1048576 #define LOWER 1048576 #define PN 10 問題数 #define NF 2400000 ハッシュにつかう魔法の数!? #define NM 4 重なりの上限値(3 でもよかった??!!) const unsigned stbl[IN] = { 3665308701534, 7330617403068, 506241270389, 2845136891545, 1361758541367, 70690921978, 804588384145, 196489340090, 1142459568191, 7939847458483, 6088562083931, 6400576036950, 3637880320065, 1381744556, 3698108030974, 4727806475348, 6119818214606, 3931881946355, 988458873198, 4929222032268, 4210741949677, 5384036277020, 5342995695171, 986163840917, 7870495621557, 4329276825246, 2347204856362, 2959434526322, 3048315069154, 4949991960816, 3300216382790, 278119293989, 278784520727, 2817416522030, 5660250136005, 571646958192, 84846673295, 6191302978762, 6372669810753, 263849911287 }; int utbl[UPPER]; 21...40 番までの石の重さでできる重さの表 int ltbl[LOWER]; 1 ...20 番までの石の重さでできる重さの表 int atbl[NF][NM]; ハッシュ表 char* sz_default_problem_file = "problem.in3"; int main(int argc, char **argv) { char* sz_problem_file; int problem[10]; /* set filename */ if(argc<2){ sz_problem_file = sz_default_problem_file; } else { sz_problem_file = argv[1]; } /* file read */ { FILE* fp; char buf[256]; int i; fp = fopen(sz_problem_file, "rt"); if(!fp) { perror(sz_problem_file); return(-1); } for(i=0; i>> Found Exactly!!\n" ">>> Answer:", i, problem[i]); for(l=0; l<20; l++){ if((atbl[ta][k]>>l)&1) printf(" %d,", l+1); } for(l=0; l<20; l++){ if((j>>l)&1) printf(" %d,", l+21); } puts("\n"); #pragma _CRI endguard goto FIND; } } } FIND:; } } return 0; }