結果
問題 | No.753 最強王者決定戦 |
ユーザー | tempura_pp |
提出日時 | 2018-11-10 00:18:52 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 346 ms / 1,000 ms |
コード長 | 1,236 bytes |
コンパイル時間 | 810 ms |
コンパイル使用メモリ | 97,708 KB |
実行使用メモリ | 11,708 KB |
最終ジャッジ日時 | 2024-11-21 07:19:54 |
合計ジャッジ時間 | 2,938 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 341 ms
11,520 KB |
testcase_01 | AC | 346 ms
11,688 KB |
testcase_02 | AC | 338 ms
11,708 KB |
testcase_03 | AC | 340 ms
11,636 KB |
ソースコード
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<iomanip> #include<math.h> #include<complex> #include<queue> #include<deque> #include<stack> #include<map> #include<set> #include<bitset> #include<functional> using namespace std; #define REP(i,m,n) for(int i=(int)m ; i < (int) n ; ++i ) #define rep(i,n) REP(i,0,n) typedef long long ll; typedef pair<int,int> pint; typedef pair<ll,int> pli; const int inf=1e9+7; const ll longinf=1LL<<60 ; const ll mod=1e9+7 ; ll fact[17],dp[16][65536]; int n=16,m=65536,a[16][16]; ll rec(int k,int mask){ if(dp[k][mask]!=-1)return dp[k][mask]; int cnt=__builtin_popcount(mask); if(cnt==1)return 1; int bit=mask^(1<<k); ll sum=0; for(int i=bit;i>=0;i--){ i&=bit; int c=__builtin_popcount(i); if(2*c!=cnt)continue; ll res=0; rep(j,16)if((i&(1<<j))&&a[k][j]==1)res+=rec(j,i); res*=rec(k,mask-i); res*=2; sum+=res; } return dp[k][mask]=sum; } int main(){ fact[0]=1; rep(i,n)fact[i+1]=fact[i]*(i+1); rep(i,n)rep(j,m)dp[i][j]=-1; rep(i,n)rep(j,n){ cin>>a[i][j]; if(i>j)a[i][j]=-a[j][i]; } rep(i,n)cout<<rec(i,m-1)<<endl; return 0; }