結果
| 問題 |
No.1937 Various Tournament
|
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2022-05-13 22:26:42 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,282 ms / 2,000 ms |
| コード長 | 1,576 bytes |
| コンパイル時間 | 4,519 ms |
| コンパイル使用メモリ | 258,536 KB |
| 最終ジャッジ日時 | 2025-01-29 07:13:52 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 47 |
ソースコード
#include <stdio.h>
#include <atcoder/all>
#include <bits/stdc++.h>
using namespace std;
using namespace atcoder;
using mint = modint998244353;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define Inf 1000000001
int n;
vector<string> s;
int main(){
cin>>n;
s.resize(n,"");
rep(i,n){
rep(j,n){
int t;
cin>>t;
s[i] += '0'+t;
}
}
/*
n = 16;
s.resize(16,string(16,'b'));
rep(i,n){
rep(j,n){
if(i<j)s[i][j] = '1';
else s[i][j] = '0';
}
}
*/
vector<long long> ans(n,0);
vector<long long> ddp,ndp;
rep(i,n){
vector<long long> dp(1<<n,0);
dp[1<<i] = 1;
long long c = 1LL;
while(c!=n){
rep(j,dp.size()){
if(__builtin_popcount(j)!=c||dp[j]==0)continue;
vector<int> x,y;
rep(k,n){
if((j>>k)&1)x.push_back(k);
else y.push_back(k);
}
ddp.assign(1<<y.size(),0);
ddp[0] = 1;
rep(k,x.size()){
ndp.assign(1<<y.size(),0);
rep(l,ddp.size()){
if(ddp[l]==0)continue;
rep(ll,y.size()){
if((l>>ll)&1)continue;
if(s[x[k]][y[ll]]=='0')continue;
ndp[l | (1<<ll)] += ddp[l];
}
}
swap(ddp,ndp);
}
rep(k,ddp.size()){
if(ddp[k]==0)continue;
int T =0;
rep(l,y.size()){
if((k>>l)&1)T |= 1<<y[l];
}
//cout<<j<<','<<T<<endl;
dp[T|j] += dp[j] * ddp[k];
}
//dp[j] = 0;
}
c*=2;
/*
rep(j,dp.size()){
cout<<dp[j]<<',';
}
cout<<endl;
*/
}
ans[i] += dp.back();
//ans[i] += dp.back();
}
rep(i,n)ans[i] *= 1LL<<(n-1);
rep(i,n){
cout<<ans[i]<<endl;
}
return 0;
}
沙耶花