結果
問題 | No.753 最強王者決定戦 |
ユーザー |
![]() |
提出日時 | 2018-11-20 18:26:18 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 46 ms / 1,000 ms |
コード長 | 1,891 bytes |
コンパイル時間 | 908 ms |
コンパイル使用メモリ | 74,640 KB |
実行使用メモリ | 15,104 KB |
最終ジャッジ日時 | 2024-12-24 15:35:47 |
合計ジャッジ時間 | 1,616 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 4 |
ソースコード
#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"; } }