結果
問題 | No.753 最強王者決定戦 |
ユーザー | horiesiniti |
提出日時 | 2018-11-20 18:26:18 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 29 ms / 1,000 ms |
コード長 | 1,891 bytes |
コンパイル時間 | 876 ms |
コンパイル使用メモリ | 74,780 KB |
実行使用メモリ | 15,180 KB |
最終ジャッジ日時 | 2024-06-06 21:14:10 |
合計ジャッジ時間 | 1,357 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 28 ms
15,120 KB |
testcase_01 | AC | 29 ms
15,104 KB |
testcase_02 | AC | 29 ms
15,180 KB |
testcase_03 | AC | 29 ms
15,052 KB |
ソースコード
#include <iostream> #include<vector> #include<string.h> #include<bitset> using namespace std; int data[17][17]; const int LIMIT=16; long long int dp[70000][16]; vector<long long int> seed[17]; vector<long long int> perm[70000]; int isV(int p1,int p2){ if(p1>p2){ std::swap(p1,p2); } if(data[p1][p2]==1)return p1; return p2; } int main(){ memset(dp,0,sizeof(dp)); for(int i=0;i<LIMIT;i++){ for(int j=0;j<LIMIT;j++){ scanf("%d",&data[i][j]); } } vector<long long int> vec[17]; for(int i=1;i<=65535;i++){ bitset<16> b1(i); int t=b1.count(); if(t==2||t==4||t==8){ if((t<8)||((t==8)&&((i&1)==1))){ seed[b1.count()].push_back(i); } for(int j=0;j<16;j++){ if((i&(1<<j))!=0){ perm[i].push_back(j); } } } } for(int i=0;i<LIMIT;i++){ for(int j=i+1;j<LIMIT;j++){ dp[(1<<i)|(1<<j)][isV(i,j)]=2; } } for(int i=0;i<seed[2].size();i++){ for(int j=i+1;j<seed[2].size();j++){ int l=seed[2][i]; int r=seed[2][j]; if((l&r)==0){ for(int x=0;x<2;x++){ for(int y=0;y<2;y++){ int a=perm[l][x]; int b=perm[r][y]; int v=isV(a,b); dp[l|r][v]+=(dp[l][a]*dp[r][b])*2; } } } } } for(int i=0;i<seed[4].size();i++){ for(int j=i+1;j<seed[4].size();j++){ int l=seed[4][i]; int r=seed[4][j]; if((l&r)==0){ for(int x=0;x<4;x++){ int a=perm[l][x]; if(dp[l][a]==0)continue; for(int y=0;y<4;y++){ int b=perm[r][y]; int v=isV(a,b); dp[l|r][v]+=(dp[l][a]*dp[r][b])*2; } } } } } for(int i=0;i<seed[8].size();i++){ int l=seed[8][i]; int r=(~l)&(0xffff); for(int x=0;x<8;x++){ int a=perm[l][x]; if(dp[l][a]==0)continue; for(int y=0;y<8;y++){ int a=perm[l][x]; int b=perm[r][y]; int v=isV(a,b); dp[l|r][v]+=(dp[l][a]*dp[r][b])*2; } } } for(int i=0;i<16;i++){ cout<<dp[0xffff][i]<<"\n"; } }