結果
| 問題 |
No.1400 すごろくで世界旅行
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-02-19 22:03:44 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,428 bytes |
| コンパイル時間 | 922 ms |
| コンパイル使用メモリ | 96,416 KB |
| 最終ジャッジ日時 | 2025-01-19 00:03:43 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 14 TLE * 4 |
ソースコード
//https://ideone.com/8AsuI2
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <functional>
#include <ctime>
using namespace std;
namespace bitmatrix {
typedef unsigned long long ull;
struct mat {
int n, m;
vector<vector<ull>> x;
mat(int m, int n) : m(m), n(n), x(1+m/8, vector<ull>(1+n/8)) { }
bool get(int i, int j) const {
return x[i/8][j/8] & (1ull << (8*(i%8)+(j%8)));
}
void set(int i, int j, int b) {
if (b) x[i/8][j/8] |= (1ull << (8*(i%8)+(j%8)));
else x[i/8][j/8] &= ~(1ull << (8*(i%8)+(j%8)));
}
};
ostream &operator<<(ostream &os, const mat &A) {
for (int i = 0; i < A.m; ++i) {
for (int j = 0; j < A.n; ++j)
os << A.get(i, j);
os << endl;
}
return os;
}
mat eye(int n) {
mat I(n, n);
for (int i = 0; i < I.x.size(); ++i)
I.x[i][i] = 0x8040201008040201;
return I;
}
mat add(mat A, const mat &B) {
for (int i = 0; i < A.x.size(); ++i)
for (int j = 0; j < A.x[0].size(); ++j)
A.x[i][j] |= B.x[i][j];
return A;
}
ull mul(ull a, ull b) { // C[i][j] |= A[i][k] & B[k][j]
const ull u = 0xff, v = 0x101010101010101;
ull c = 0;
for (;a && b; a >>= 1, b >>= 8)
c |= (((a & v) * u) & ((b & u) * v));
return c;
}
mat mul(mat A, mat B) {
mat C(A.n, B.m);
for (int i = 0; i < A.x.size(); ++i)
for (int k = 0; k < B.x.size(); ++k)
for (int j = 0; j < B.x[0].size(); ++j)
C.x[i][j] |= mul(A.x[i][k], B.x[k][j]);
return C;
}
mat pow(mat A, long long k) {
mat X = eye(A.n);
for (; k > 0; k >>= 1) {
if (k & 1ll) X = mul(X, A);
A = mul(A, A);
}
return X;
}
ull transpose(ull a) {
ull t = (a ^ (a >> 7)) & 0xaa00aa00aa00aa;
a = a ^ t ^ (t << 7);
t = (a ^ (a >> 14)) & 0xcccc0000cccc;
a = a ^ t ^ (t << 14);
t = (a ^ (a >> 28)) & 0xf0f0f0f0;
a = a ^ t ^ (t << 28);
return a;
}
mat transpose(mat A) {
mat B(A.m, A.n);
for (int i = 0; i < A.x.size(); ++i)
for (int j = 0; j < A.x[0].size(); ++j)
B.x[j][i] = transpose(A.x[i][j]);
return B;
}
}
using namespace bitmatrix;
int main() {
int n;
cin >> n;
long long t;
cin >> t;
mat A(n, n);
string s;
for(int i=0;i<n;i++){
cin >> s;
for(int j=0;j<n;j++){
if(s[j]=='0'){A.set(i,j,0);}
else{A.set(i,j,1);}
}
}
A=pow(A,t);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(A.get(i,j)==0){puts("No");return 0;}
}
}
puts("Yes");
return 0;
}