結果

提出番号 2036
提出者 rickytheta
言語 C++
提出日時 2018-08-04 15:01:21
問題名 (64)Or Plus Max 2
結果 WA
点数 22%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 3ms 10080KB
2 AC 100% 2ms 7248KB
3 AC 100% 2ms 8416KB
4 AC 100% 5ms 15264KB
5 AC 100% 5ms 15280KB
6 AC 100% 5ms 15280KB
7 AC 100% 4ms 12656KB
8 AC 100% 4ms 13984KB
9 AC 100% 6ms 15280KB
10 AC 100% 2ms 7552KB
11 AC 100% 5ms 15264KB
12 AC 100% 5ms 15280KB
テストケース 結果 得点 実行時間 メモリ使用量
13 AC 100% 23ms 37360KB
14 AC 100% 27ms 36064KB
15 AC 100% 29ms 37360KB
16 AC 100% 18ms 34768KB
17 AC 100% 26ms 37344KB
18 AC 100% 18ms 32176KB
19 AC 100% 95ms 37360KB
20 AC 100% 76ms 37344KB
テストケース 結果 得点 実行時間 メモリ使用量
21 WA 0% 2ms 0KB
22 WA 0% 2ms 0KB
23 WA 0% 2ms 0KB
24 WA 0% 2ms 0KB
25 WA 0% 2ms 0KB
26 WA 0% 2ms 0KB
27 WA 0% 2ms 0KB
28 WA 0% 2ms 0KB
29 WA 0% 2ms 0KB
30 WA 0% 2ms 0KB
テストケース 結果 得点 実行時間 メモリ使用量
31 WA 0% 2ms 0KB
32 WA 0% 2ms 0KB
33 WA 0% 2ms 0KB
34 WA 0% 2ms 0KB
35 WA 0% 2ms 0KB
36 WA 0% 2ms 0KB
37 WA 0% 2ms 0KB
38 WA 0% 2ms 0KB
39 WA 0% 2ms 0KB
40 WA 0% 2ms 0KB
41 WA 0% 2ms 0KB

ソースコード

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef int _loop_int;
#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)

#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl
#define ALL(a) (a).begin(),(a).end()

#define CHMIN(a,b) a=min((a),(b))
#define CHMAX(a,b) a=max((a),(b))

// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a)%MOD+MOD)%MOD

int n,k,p;

int a[25];
int dfs(int i){
  if(i==n){
    int ret = 0;
    REP(i,n){
      int xr = 0;
      int sm = 0;
      FOR(j,i,n){
        xr ^= a[j];
        sm += a[j];
        if(xr==sm)ret++;
      }
    }
    return ret==k ? 1 : 0;
  }else{
    int ret = 0;
    FOR(x,1,p){
      a[i] = x;
      ret += dfs(i+1);
    }
    return ret;
  }
}

int dp[25][1<<8][325];

int dpsolve(){
  REP(i,n+1)REP(j,1<<p)REP(kk,k+1)dp[i][j][kk] = 0;
  dp[0][1][0] = true;
  REP(i,n)REP(msk,1<<p)REP(kk,k){
    FOR(x,1,p){
      int nm = 1;
      int tmp = 0;
      REP(j,p)if((msk>>j)&1){
        int xr = j ^ x;
        int sm = j + x;
        if(xr == sm){
          tmp++;
          nm |= (1<<xr);
        }
      }
      dp[i+1][nm][kk+tmp] += dp[i][msk][kk];
      dp[i+1][nm][kk+tmp] %= MOD;
    }
  }
  int ans = 0;
  REP(i,1<<p)(ans += dp[n][i][k]) %= MOD;
  return ans;
}

int main(){
  scanf("%d%d%d",&n,&k,&p);
  if(false && n<=7 && p<=8){
    int ans = dfs(0);
    printf("%d\n", ans);
  }else if(n<=24 && p<=8){
    int ans = dpsolve();
    printf("%d\n", ans);
  }else{
    assert(false);
  }
  return 0;
}