結果
| 問題 |
No.3225 2×2行列相似判定 〜easy〜
|
| ユーザー |
|
| 提出日時 | 2025-08-08 22:55:20 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 6,794 bytes |
| コンパイル時間 | 1,759 ms |
| コンパイル使用メモリ | 174,944 KB |
| 実行使用メモリ | 146,888 KB |
| 最終ジャッジ日時 | 2025-08-08 22:55:31 |
| 合計ジャッジ時間 | 4,830 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 32 WA * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define double long double
using ll = long long;
using ull = unsigned long long;
using VB = vector<bool>;
using VVB = vector<VB>;
using VVVB = vector<VVB>;
using VC = vector<char>;
using VVC = vector<VC>;
using VI = vector<int>;
using VVI = vector<VI>;
using VVVI = vector<VVI>;
using VVVVI = vector<VVVI>;
using VL = vector<ll>;
using VVL = vector<VL>;
using VVVL = vector<VVL>;
using VVVVL = vector<VVVL>;
using VVVVVL = vector<VVVVL>;
using VD = vector<double>;
using VVD = vector<VD>;
using VVVD = vector<VVD>;
using VT = vector<string>;
using VVT = vector<VT>;
//using P = pair<int, int>;
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define FOR(i, a, b) for (ll i = a; i < (ll)(b); i++)
#define ALL(a) (a).begin(),(a).end()
constexpr int INF = 1001001001;
constexpr ll LINF = 1001001001001001001ll;
//constexpr ll LINF = 8e18;
//constexpr int DX[] = {-1, -1, 0, 0, 1, 1};
//constexpr int DY[] = {-1, 0, -1, 1, 0, 1};
constexpr int DX[] = {1, 0, -1, 0, 0, 0};
constexpr int DY[] = {0, 1, 0, -1, 0, 0};
constexpr int DZ[] = {0, 0, 0, 0, 1, -1};
template< typename T1, typename T2>
inline bool chmax(T1 &a, T2 b) {return a < b && (a = b, true); }
template< typename T1, typename T2>
inline bool chmin(T1 &a, T2 b) {return a > b && (a = b, true); }
const ll MOD = 998244353;
//const ll MOD = 1000000007;
const int MAX_N = 250000;
int par[MAX_N];
int rnk[MAX_N];
int siz[MAX_N];
void init(int n) {
REP(i,n) {
par[i] = i;
rnk[i] = 0;
siz[i] = 1;
}
}
int find(int x) {
if (par[x] == x) {
return x;
} else {
return par[x] = find(par[x]);
}
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return;
int s = siz[x] + siz[y];
if (rnk[x] < rnk[y]) {
par[x] = y;
} else {
par[y] = x;
if (rnk[x] == rnk[y]) rnk[x]++;
}
siz[find(x)] = s;
}
bool same(int x, int y) {
return find(x) == find(y);
}
int size(int x) {
return siz[find(x)];
}
ll mod_pow(ll x, ll n, ll mod) {
ll res = 1;
x %= mod;
while (n > 0) {
if (n & 1) res = res * x % mod;
x = x * x % mod;
n >>= 1;
}
return res;
}
ll gcd(ll x, ll y) {
if (y == 0) return x;
return gcd(y, x % y);
}
typedef pair<ll, int> P0;
struct edge { ll to; ll cost; };
const int MAX_V = 6000000;
//const ll LINF = 1LL<<60;
int V;
vector<edge> G[MAX_V];
ll D[MAX_V];
void dijkstra(ll s) {
priority_queue<P0, vector<P0>, greater<P0> > que;
fill(D, D + V, LINF);
D[s] = 0;
que.push(P0(0, s));
while (!que.empty()) {
P0 p = que.top(); que.pop();
int v = p.second;
if (D[v] < p.first) continue;
for (edge e : G[v]) {
if (D[e.to] > D[v] + e.cost) {
D[e.to] = D[v] + e.cost;
que.push(P0(D[e.to], e.to));
}
}
}
}
/*
double EPS = 1e-10;
double add(double a, double b) {
if (abs(a + b) < EPS * (abs(a) + abs(b))) return 0;
return a + b;
}
struct P {
double x, y;
P() {}
P(double x, double y) : x(x), y(y) {
}
P operator + (P p) {
return P(add(x, p.x), add(y, p.y));
}
P operator - (P p) {
return P(add(x, -p.x), add(y, -p.y));
}
P operator * (double d) {
return P(x * d, y * d);
}
double dot(P p) {
return add(x * p.x, y * p.y);
}
double det(P p) {
return add(x * p.y, -y * p.x);
}
};
bool on_seg(P p1, P p2, P q) {
return ()
}
P intersection(P p1, P p2, P q1, P q2) {
return p1 + (p2 - p1) * ((q2 - q1).det(q1 - p1) / (q2 - q1).det(p2 - p1));
}
*/
/*
VL f(400010, 1);
ll C(ll n, ll k) {
return f[n] * mod_pow(f[k], MOD - 2, MOD) % MOD * mod_pow(f[n - k], MOD - 2, MOD) % MOD;
}
*/
bool fcomp(VL x, VL y) {
return x[1] * y[0] < x[0] * y[1];
}
// 拡張ユークリッドの互除法の実装例
// ax + by = \pm gcd(a, b) となるx,yを返す
pair<long long, long long> extgcd(long long a, long long b) {
if (b == 0) return make_pair(1, 0);
long long x, y;
tie(y, x) = extgcd(b, a % b);
y -= a / b * x;
return make_pair(x, y);
}
/*
const int MAX_V = 200000;
struct edge {
int to;
ll cost;
};
typedef pair<ll, int> P; // first: 最短距離, second: 頂点番号
ll V, d[MAX_V], cnt[MAX_V];
vector<edge> G[MAX_V]; // 隣接リスト表現
void dijkstra(int s) {
fill(d, d + V, LINF);
d[s] = 0; // 始点sへの最短距離は0
fill(cnt, cnt + V, 0);
cnt[s] = 1; // 始点sへの最短経路数は1
priority_queue<P, vector<P>, greater<P>> que; // 距離が小さい順に取り出せるようgreater<P>を指定
que.push(P(0, s));
while (!que.empty()) {
P p = que.top();
que.pop();
int v = p.second; // 更新した頂点の中で距離が最小の頂点v
if (d[v] < p.first) {
continue;
}
for (auto e : G[v]) { // 頂点vから出る辺eを走査
if (d[e.to] > d[v] + e.cost) {
d[e.to] = d[v] + e.cost;
que.push(P(d[e.to], e.to));
cnt[e.to] = cnt[v]; // コストが更新された場合は直前の頂点への最短経路数で上書き
} else if (d[e.to] == d[v] + e.cost) {
cnt[e.to] += cnt[v]; // コストが一致する場合はこれまでの最短経路数を足し合わせ
}
}
}
}
*/
ll extgcd(ll a, ll b, ll& x, ll& y) {
ll d = a;
if (b != 0) {
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
} else {
x = 1; y = 0;
}
return d;
}
ll mod_inverse(ll a, ll m) {
ll x, y;
extgcd(a, m, x, y);
return (m + x % m) % m;
}
VL prod(VL a, VL b) {
return {
a[0] * b[0] + a[1] * b[2],
a[0] * b[1] + a[1] * b[3],
a[2] * b[0] + a[3] * b[2],
a[2] * b[1] + a[3] * b[3]
};
}
int main() {
ios::sync_with_stdio(false);
std::cin.tie(nullptr);
ll a, b, c, d, e, f, g, h;
cin >> a >> b >> c >> d >> e >> f >> g >> h;
ll x = a * d - b * c, y = e * h - f * g;
if ((a - e) % 67 == 0 && (b - f) % 67 == 0 && (c - g) % 67 == 0 && (d - h) % 67 == 0) {
cout << "Yes\n";
return 0;
}
if (x % 67 == 0 || y % 67 == 0) {
cout << "No\n";
return 0;
}
if (((a + d) * (a + d) - (a * d - b * c) * 4) % 67 == 0) {
cout << "No\n";
return 0;
}
if (((e + h) * (e + h) - (e * h - f * g) * 4) % 67 == 0) {
cout << "No\n";
return 0;
}
//cout << (a + d - e - h) % 67 << endl;
//cout << (x - y) % 67 << endl;
if ((a + d - e - h) % 67 == 0 && (x - y) % 67 == 0) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}