結果
| 問題 |
No.3225 2×2行列相似判定 〜easy〜
|
| ユーザー |
kazuppa
|
| 提出日時 | 2025-10-19 22:18:50 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,176 ms / 2,000 ms |
| コード長 | 11,063 bytes |
| コンパイル時間 | 5,487 ms |
| コンパイル使用メモリ | 307,404 KB |
| 実行使用メモリ | 7,716 KB |
| 最終ジャッジ日時 | 2025-10-19 22:19:13 |
| 合計ジャッジ時間 | 21,589 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
#include <chrono>
#include <complex>
#include <cmath>
#include <unistd.h>
#define pc_u putchar
#pragma GCC target ("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#define rep(i,a,b) for(it i=(it)(a);i<(it)b;i++)
#define rep2(i,a,b,c) for(it i=(it)(a);i<(it)b;i+=(it)c)
#define repp(i,a,b) for(it i=(it)(a);i<=(it)b;i++)
#define repp2(i,a,b,c) for(it i=(it)(a);i<=(it)b;i+=(it)c)
#define irep(i,a,b) for(int i=(int)(a);i<(int)b;i++)
#define irep2(i,a,b,c) for(int i=(int)(a);i<(int)b;i+=c)
#define irepp(i,a,b) for(int i=(int)(a);i<=(int)b;i++)
#define irepp2(i,a,b,c) for(int i=(int)(a);i<=(int)b;i+=c)
#define nrep(i,a,b) for(it i=(it)(a)-1;i>=(it)b;i--)
#define nrepp(i,a,b) for(it i=(it)(a);i>=(it)b;i--)
#define inrep(i,a,b) for(int i=(int)(a)-1;i>=(int)b;i--)
#define inrepp(i,a,b) for(int i=(int)(a);i>=(int)b;i--)
#define inrep2(i,a,b,c) for(int i=(int)(a)-1;i>=(int)b;i-=c)
#define inrepp2(i,a,b,c) for(int i=(int)(a);i>=(int)b;i-=c)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define Min(x) *min_element(all(x))
#define Max(x) *max_element(all(x))
#define popcount(x) __builtin_popcountll(x)
#define moda 998244353LL
#define modb 1000000007LL
#define modc 968244353LL
#define dai 2502502502502502502LL
#define sho -dai
#define aoi 1e18+1e6
#define giri 1010000000
#define en 3.14159265358979
#define eps 1e-14
#define fi first
#define se second
#define elif else if
template<typename T> using pq=priority_queue<T>;
template<typename T> using pqg=priority_queue<T,vector<T>,greater<T>>;
#define uni(a) a.erase(unique(all(a)),a.end())
using it=long long;
using itn=int;
using un=unsigned long long;
using idb=double;
using db=long double;
using st=string;
using ch=char;
using bo=bool;
using P=pair<it,it>;
using ip=pair<int,int>;
using vi=vector<it>;
using ivi=vector<int>;
using ivd=vector<idb>;
using vd=vector<db>;
using vs=vector<st>;
using vc=vector<ch>;
using vb=vector<bo>;
using vp=vector<P>;
using ivp=vector<ip>;
using sp=set<P>;
using isp=set<ip>;
using ss=set<st>;
using sca=set<ch>;
using si=set<it>;
using isi=set<int>;
using svi=set<vi>;
using svb=set<vb>;
using vvi=vector<vi>;
using ivvi=vector<ivi>;
using ivvd=vector<ivd>;
using vvd=vector<vd>;
using vvs=vector<vs>;
using vvb=vector<vb>;
using vvc=vector<vc>;
using vvp=vector<vp>;
using ivvp=vector<ivp>;
using vsi=vector<si>;
using ivsi=vector<isi>;
using isvi=set<ivi>;
using vsc=vector<sca>;
using vsp=vector<sp>;
using ivsp=vector<isp>;
using vvsi=vector<vsi>;
using ivvsi=vector<ivsi>;
using vvsp=vector<vsp>;
using ivvsp=vector<ivsp>;
using svvb=set<vvb>;
using vvvi=vector<vvi>;
using ivvvi=vector<ivvi>;
using ivvvd=vector<ivvd>;
using vvvd=vector<vvd>;
using vvvb=vector<vvb>;
using ivvvp=vector<ivvp>;
using vvvp=vector<vvp>;
using vvvvi=vector<vvvi>;
using ivvvvi=vector<ivvvi>;
using vvvvd=vector<vvvd>;
using vvvvb=vector<vvvb>;
using ivvvvp=vector<ivvvp>;
using vvvvp=vector<vvvp>;
using ivvvvvi=vector<ivvvvi>;
using vvvvvi=vector<vvvvi>;
using ivvvvvvi=vector<ivvvvvi>;
using vvvvvvi=vector<vvvvvi>;
using ivvvvvvvi=vector<ivvvvvvi>;
using vvvvvvvi=vector<vvvvvvi>;
using vvvvvvvvi=vector<vvvvvvvi>;
const int dx[8]={0,1,0,-1,1,1,-1,-1};
const int dy[8]={1,0,-1,0,1,-1,1,-1};
st abc="abcdefghijklmnopqrstuvwxyz";
st ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
st num="0123456789";
st mb="xo";
st MB="XO";
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T> using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;
namespace {
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
os << p.first << " " << p.second;
return os;
}
template <typename T, typename U>
istream &operator>>(istream &is, pair<T, U> &p) {
is >> p.first >> p.second;
return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
int s = (int)v.size();
for (int i = 0; i < s; i++) os << (i ? " " : "") << v[i];
return os;
}
template <typename T>
istream &operator>>(istream &is, vector<T> &v) {
for (auto &x : v) is >> x;
return is;
}
istream &operator>>(istream &is, __int128_t &x) {
string S;
is >> S;
x = 0;
int flag = 0;
for (auto &c : S) {
if (c == '-') {
flag = true;
continue;
}
x *= 10;
x += c - '0';
}
if (flag) x = -x;
return is;
}
istream &operator>>(istream &is, __uint128_t &x) {
string S;
is >> S;
x = 0;
for (auto &c : S) {
x *= 10;
x += c - '0';
}
return is;
}
ostream &operator<<(ostream &os, __int128_t x) {
if (x == 0) return os << 0;
if (x < 0) os << '-', x = -x;
string S;
while (x) S.push_back('0' + x % 10), x /= 10;
reverse(begin(S), end(S));
return os << S;
}
ostream &operator<<(ostream &os, __uint128_t x) {
if (x == 0) return os << 0;
string S;
while (x) S.push_back('0' + x % 10), x /= 10;
reverse(begin(S), end(S));
return os << S;
}
void input() {}
template <typename T, class... U>
void input(T &t, U &...u) {
cin >> t;
input(u...);
}
template <typename T, class... U>
void input1(T &t, U &...u) {
input(u...);
}
void print() { cout << "\n"; }
template <typename T, class... U, char sep = ' '>
void print(const T &t, const U &...u) {
cout << t;
if (sizeof...(u)) cout << sep;
print(u...);
}
template <typename T, class... U, char sep = ' '>
void print1(const T &t, const U &...u) {
print(u...);
}
struct IoSetupNya {
IoSetupNya() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(15);
cerr << fixed << setprecision(7);
}
} iosetupnya;
} //namespace Nyaan
template<typename T>
T Sum(vector<T> &a){
T s=0;
for(auto i:a)s+=i;
return s;
}
template<typename T>
T Sum(vector<T> &a,int l,int r){
T s=0;
irep(i,l,r)s+=a[i];
return s;
}
template <typename T>
void dec(vector<T> &t,T k=1){
for(auto &i:t)i-=k;
}
template <typename T>
void inc(vector<T> &t,T k=1){
for(auto &i:t)i+=k;
}
template <typename T>
vector<T> make_vec(int n,T t){
vector<T> g(n);
for(auto &i:g)i=t;
return g;
}
template <typename T>
vector<T> subvec(vector<T> a,int f,int l){
vector<T> g(l);
irep(i,f,f+l)g[i-f]=a[i];
return g;
}
template<typename T>
T gcda(T a,T b){
if(!a||!b)return max(a,b);
while(a%b&&b%a){
if(a>b)a%=b;
else b%=a;
}
return min(a,b);
}
it lcma(it a,it b){
return a/gcda(a,b)*b;
}
db distance(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
db getAngle(db xa, db ya, db xb, db yb, db xc, db yc) {
//角BACを求める
//E8さんの記事コピペ
db VectorAB = sqrt((xb - xa) * (xb - xa) + (yb - ya) * (yb - ya));
db VectorAC = sqrt((xc - xa) * (xc - xa) + (yc - ya) * (yc - ya));
db Naiseki = (xb - xa) * (xc - xa) + (yb - ya) * (yc - ya);
db cosTheta = Naiseki / (VectorAB * VectorAC);
return acos(cosTheta) * 180.0 / 3.14159265358979;
}
long double segment_origin_dist(long double A, long double B, long double C, long double D) {
// P = (A,B), Q = (C,D)
long double vx = C - A, vy = D - B; // ベクトルPQ
long double wx = -A, wy = -B; // ベクトルPO (O-P)
long double vv = vx * vx + vy * vy; // |PQ|^2
if (vv == 0) {
// P == Q の場合、点と原点の距離
return sqrt(A * A + B * B);
}
long double t = (wx * vx + wy * vy) / vv; // 射影パラメータ
long double nx, ny; // 最近点
if (t <= 0) {
nx = A; ny = B;
} else if (t >= 1) {
nx = C; ny = D;
} else {
nx = A + t * vx;
ny = B + t * vy;
}
return sqrt(nx * nx + ny * ny);
}
bo outc(int h,int w,int x,int y){
return (x<0||x>=h||y<0||y>=w);
}
template<typename T>
vector<vector<T>> nep(vector<T> a){
vector<vector<T>> e;
sort(all(a));
do{
e.emplace_back(a);
}while(next_permutation(all(a)));
return e;
}
template<typename T>
void chmin(T &a,T b){a=min(a,b);}
template<typename T>
void chmax(T &a,T b){a=max(a,b);}
void yn(bo a){print(a?string("Yes"):string("No"));}
void YN(bo a){print(a?string("YES"):string("NO"));}
struct dsu1{
ivi par,siz;
dsu1(int n){
init(n);
}
void init(int n){
irep(i,0,n){
par.emplace_back(i);
}
siz.resize(n,1);
}
int leader(int u){
if(par[u]==u)return u;
return par[u]=leader(par[u]);
}
void merge(int u,int v){
int ru=leader(u),rv=leader(v);
if(ru==rv)return;
if(size(ru)<size(rv))swap(ru,rv);
siz[ru]+=siz[rv];
par[rv]=ru;
}
bool same(int u,int v){
return leader(u)==leader(v);
}
int size(int u){
return siz[leader(u)];
}
};
struct edge{
int f;
int t;
it l;
};
void input(edge &a){input(a.f,a.t,a.l);}
bo comppppp(edge &a,edge &b){return a.l<b.l;}
it minspantree(vector<edge> &e,int n){
/*
与えられた辺を持つグラフの最小全域木を求める
存在する場合はその答えを 存在しないならinf
計算量はO(MlogM+N)くらい
*/
vector<edge> g=e;sort(all(g),comppppp);
it ans=0;
dsu1 uf(n);
for(auto i:g){
if(!uf.same(i.f,i.t)){
uf.merge(i.f,i.t);
ans+=i.l;
}
}
if(uf.size(0)==n)return ans;
return dai;
}
#include <atcoder/all>
using namespace atcoder;
using mints=modint998244353;
using mint=modint;
using minto=modint1000000007;
using vm=vector<mint>;
using vms=vector<mints>;
using vmo=vector<minto>;
using vvm=vector<vm>;
using vvms=vector<vms>;
using vvmo=vector<vmo>;
using vvvm=vector<vvm>;
using vvvms=vector<vvms>;
using vvvmo=vector<vvmo>;
using vvvvm=vector<vvvm>;
using vvvvms=vector<vvvms>;
using vvvvmo=vector<vvvmo>;
using vvvvvm=vector<vvvvm>;
using vvvvvms=vector<vvvvms>;
using vvvvvmo=vector<vvvvmo>;
using vvvvvvm=vector<vvvvvm>;
using vvvvvvms=vector<vvvvvms>;
using vvvvvvmo=vector<vvvvvmo>;
using vvvvvvvms=vector<vvvvvvms>;
using vvvvvvvmo=vector<vvvvvvmo>;
/*総和をもとめるセグ木
struct nod{
it val;
nod(it v=0):val(v){}
};
nod op(nod a,nod b){return nod(a.val+b.val);}
nod e(){return nod(0);}
struct act{
it a;
act(it e=0):a(e){}
};
nod mapping(act f,nod x){return nod(f.a+x.val);}
act comp(act f,act g){return act(f.a+g.a);}
act id(){return act(0);}*/
//#define endl '\n'
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
void solve(){
int p=67;
mint::set_mod(p);
vvm l(2,vm(2)),r(2,vm(2));
irep(i,0,2)
irep(j,0,2){
int a;input(a);
l[i][j]=a;
}
irep(i,0,2)
irep(j,0,2){
int a;input(a);
r[i][j]=a;
}
irep(w,0,p)
irep(x,0,p)
irep(y,0,p)
irep(z,0,p){
if(w*z%p==x*y%p)continue;
if((w*l[0][0]+x*l[1][0])!=(r[0][0]*w+r[0][1]*y))continue;
if((w*l[0][1]+x*l[1][1])!=(r[0][0]*x+r[0][1]*z))continue;
if((y*l[0][0]+z*l[1][0])!=(r[1][0]*w+r[1][1]*y))continue;
if((y*l[0][1]+z*l[1][1])!=(r[1][0]*x+r[1][1]*z))continue;
yn(1);
//print(w,x,y,z);
return;
}
yn(0);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t=1;//input(t);
while(t--)solve();
}
kazuppa