AOJ 0070 - Combination of Number Sequences
a[1<<10]じゃRuntime Errorでした.a[1<<11]だとできました.
1<<10(=2^10)でもいいと思うのですが,よくわかりません.
容量は少し余分にとっておくべきですね.(MLEしたら残念)
#include<iostream> int n, s; int a[1<<11][340]; //S: つかったもの //v: さっきつかったもの //rn: 入れた数 //sum: 残る和 int rec(int S, int rn, int sum){ if(sum >= 0 && a[S][sum] != -1){ return a[S][sum]; } if(sum == 0 && rn == n){ return 1; } if(rn == n){//うまく入らなかった return 0; } if(sum < 0){ return 0; } int res = 0; for(int i=0;i<10;i++){ if(!(S >> i & 1) && sum-(rn+1)*i >= 0){//使っていない res += rec(S | (1 << i), rn+1, sum-(rn+1)*i); } } return a[S][sum] = res; } int main(){ int res; while(std::cin >> n >> s, !std::cin.eof()){ res = 0; for(int i=0;i<(1<<11);i++){ for(int j=0;j<340;j++){ a[i][j] = -1; } } for(int i=0;i<10;i++){ res += rec(1 << i, 1, s-i); } std::cout << res << std::endl; } return 0; }