結果
| 問題 |
No.3170 [Cherry 7th Tune KY] Even if you could say "See you ..."
|
| コンテスト | |
| ユーザー |
shobonvip
|
| 提出日時 | 2025-05-30 23:12:14 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 5,439 bytes |
| コンパイル時間 | 5,016 ms |
| コンパイル使用メモリ | 277,472 KB |
| 実行使用メモリ | 72,096 KB |
| 最終ジャッジ日時 | 2025-05-30 23:13:28 |
| 合計ジャッジ時間 | 23,856 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 34 TLE * 4 -- * 1 |
ソースコード
/**
author: shobonvip
created: 2025.05.30 22:38:12
**/
#include<bits/stdc++.h>
using namespace std;
//* ATCODER
#include<atcoder/all>
using namespace atcoder;
typedef modint mint;
//*/
/* BOOST MULTIPRECISION
#include<boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
//*/
typedef long long ll;
#define rep(i, s, n) for (int i = (int)(s); i < (int)(n); i++)
#define rrep(i, s, n) for (int i = (int)(n)-1; i >= (int)(s); i--)
#define all(v) v.begin(), v.end()
template <typename T> bool chmin(T &a, const T &b) {
if (a <= b) return false;
a = b;
return true;
}
template <typename T> bool chmax(T &a, const T &b) {
if (a >= b) return false;
a = b;
return true;
}
template <typename T> T max(vector<T> &a){
assert(!a.empty());
T ret = a[0];
for (int i=0; i<(int)a.size(); i++) chmax(ret, a[i]);
return ret;
}
template <typename T> T min(vector<T> &a){
assert(!a.empty());
T ret = a[0];
for (int i=0; i<(int)a.size(); i++) chmin(ret, a[i]);
return ret;
}
template <typename T> T sum(vector<T> &a){
T ret = 0;
for (int i=0; i<(int)a.size(); i++) ret += a[i];
return ret;
}
ll ceil_sqrt(ll n) {
ll ub = 2e9;
ll lb = -1;
while (ub - lb > 1) {
ll t = (ub + lb) / 2;
if (t * t >= n) {
ub = t;
}else{
lb = t;
}
}
return ub;
}
ll modpow(ll n, ll m, ll mod) {
ll v = 1;
ll w = n;
while (m > 0) {
if (m & 1) {
v = v * w % mod;
}
w = w * w % mod;
m >>= 1;
}
return v;
}
vector<vector<mint>> prod(
const vector<vector<mint>> &a,
const vector<vector<mint>> &b
) {
vector<vector<mint>> ret(2, vector<mint>(2));
rep(i,0,2)rep(j,0,2)rep(k,0,2) ret[i][j] += a[i][k] * b[k][j];
return ret;
}
vector<vector<mint>> matpow(
vector<vector<mint>> &n,
ll m
) {
vector<vector<mint>> v(2, vector<mint>(2));
v[0][0] = 1;
v[1][1] = 1;
vector<vector<mint>> w = n;
while (m > 0) {
if (m & 1) {
v = prod(v, w);
}
w = prod(w, w);
m >>= 1;
}
return v;
}
ll discrete_logarithm(ll x, ll y, ll m) {
if (m == 1) return 0;
if (y == 1) return 0;
if (x == 0 && y == 0) return 1;
ll r = ceil_sqrt(m);
map<ll,ll> d;
ll a = 1;
for (ll i=0; i<r+1; i++) {
if (a == y) return i;
if (d.find(a * y % m) == d.end()) {
d[a * y % m] = i;
}
a = a * x % m;
}
ll xi = modpow(x, r, m);
ll b = xi;
for (ll i=1; i<r+1; i++) {
if (d.find(b) != d.end()) {
ll ans = i * r - d[b];
if (modpow(x, ans, m) == y) {
return ans;
}
return -1;
}
b = b * xi % m;
}
return -1;
}
bool is_identity(vector<vector<mint>> &x) {
if (x[0][0].val() != 1) return false;
if (x[1][1].val() != 1) return false;
if (x[1][0].val() != 0) return false;
if (x[0][1].val() != 0) return false;
return true;
}
ll discrete_logarithm_matrix(vector<vector<mint>> x, vector<vector<mint>> y) {
ll r = (ll)mint::mod();
map<vector<vector<ll>>, ll> d;
vector<vector<mint>> a(2,vector<mint>(2));
a[0][0]=1;
a[1][1]=1;
for (ll i=0; i<r+1; i++) {
if (a == y) return i;
vector<vector<mint>> pr = prod(a,y);
vector<vector<ll>> prl(2, vector<ll>(2));
rep(s,0,2)rep(t,0,2)prl[s][t]=pr[s][t].val();
if (d.find(prl) == d.end()) {
d[prl] = i;
}
a = prod(a, x);
}
vector<vector<mint>> xi = matpow(x, r);
vector<vector<mint>> b = xi;
for (ll i=1; i<r+1; i++) {
vector<vector<ll>> bl(2, vector<ll>(2));
rep(s,0,2)rep(t,0,2)bl[s][t]=b[s][t].val();
if (d.find(bl) != d.end()) {
ll ans = i * r - d[bl];
if (matpow(x, ans) == y) {
return ans;
}
return -1;
}
b = prod(b, xi);
}
return -1;
}
mint det(vector<vector<mint>> &a) {
return a[0][0] * a[1][1] - a[1][0] * a[0][1];
}
void solve() {
int p; cin >> p;
mint::set_mod(p);
vector<vector<mint>> a(2, vector<mint>(2));
vector<vector<mint>> b(2, vector<mint>(2));
rep(i,0,2) rep(j,0,2) {
int x; cin >> x;
a[i][j] = x;
}
rep(i,0,2) rep(j,0,2) {
int x; cin >> x;
b[i][j] = x;
}
if (is_identity(b)) {
cout << 0 << '\n';
return;
}
if (a == b) {
cout << 1 << '\n';
return;
}
// https://math.stackexchange.com/questions/3278216/the-order-of-a-2-times-2-matrix-mod-p
// the period devides p^2-1 or p^2-p
// thus period <= p^2, so just bsgs and done in O(p sqrt(p)).
ll ans = discrete_logarithm_matrix(a, b);
cout << ans << '\n';
return;
/*
if (det(a) == 0) {
if (det(b) != 0) {
cout << -1 << '\n';
return;
}
bool mode = 0;
vector<vector<mint>> c(2, vector<mint>(2));
mint tr = a[0][0] + a[1][1];
if (tr.val() != 0) {
bool mode = 0;
mint captain = 0;
rep(i,0,2) {
rep(j,0,2) {
if (a[i][j].val() == 0 && b[i][j].val() != 0) {
cout << -1 << '\n';
return;
}
if (a[i][j].val() != 0 && b[i][j].val() == 0) {
cout << -1 << '\n';
return;
}
if (a[i][j].val() != 0 && b[i][j].val() != 0) {
if (!mode) {
captain = b[i][j] / a[i][j];
mode = 1;
} else {
if (captain.val() != (b[i][j] / a[i][j]).val()) {
cout << -1 << '\n';
return;
}
}
}
}
}
ll v = discrete_logarithm(tr.val(), captain.val(), p);
cout << v+1 << '\n';
return;
}else{
rep(i,0,2) {
rep(j,0,2) {
if (b[i][j].val() != 0) {
cout << -1 << '\n';
return;
}
}
}
cout << 1 << '\n';
return;
}
}else{
if (det(b) == 0) {
cout << -1 << '\n';
return;
}
}
*/
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t; cin >> t;
while(t--) solve();
}
shobonvip