結果
| 問題 |
No.950 行列累乗
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-12-13 04:03:51 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,873 bytes |
| コンパイル時間 | 1,173 ms |
| コンパイル使用メモリ | 97,136 KB |
| 最終ジャッジ日時 | 2025-01-08 11:13:32 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 24 WA * 13 TLE * 20 |
ソースコード
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
string tos(vector<long long> &a) {
return to_string(a[0])+","+to_string(a[1])+","+to_string(a[2])+","+to_string(a[3]);
}
void mul(vector<long long> &a, vector<long long> &c, long long p) {
vector<long long> d(4);
d[0] = (a[0] * c[0] % p + a[1] * c[2] % p) % p;
d[1] = (a[0] * c[1] % p + a[1] * c[3] % p) % p;
d[2] = (c[0] * a[2] % p + c[2] * a[3] % p) % p;
d[3] = (c[1] * a[2] % p + c[3] * a[3] % p) % p;
a = d;
}
void modpow(vector<long long> &a, long long k, long long p) {
if (k > 1) {
if (k&1) {
vector<long long> c(a);
modpow(a, k-1, p);
mul(a, c, p);
} else {
mul(a, a, p);
modpow(a, k/2, p);
}
}
}
int main() {
long long p;
vector<long long> a(4), b(4);
cin >> p;
for (int i = 0; i < 4; i++) cin >> a[i];
for (int i = 0; i < 4; i++) cin >> b[i];
if (a == b) {
cout << 1 << endl; return 0;
}
vector<long long> c(a);
vector<vector<long long>> s1;
s1.push_back(a);
vector<long long> e(a), f(b);
modpow(e, p-1, p);
unordered_map<string, int> s2;
s2[tos(b)] = 0;
for (int i=1; i <= 1e6; i++) {
mul(a, c, p);
s1.push_back(a);
mul(f, e, p);
s2[tos(f)] = i;
if (a == b) {
cout << (i+1) << endl;
return 0;
}
if (a == c) {
cout << (-1) << endl;
return 0;
}
// cout << a[0] << "," << a[1] << "," << a[2] << "," << a[3] << endl;
}
for (int i = 0; i < s1.size(); i++) {
auto y = s2.find(tos(s1[i]));
if (y != s2.end()) {
cout << ((i+1)*y->second) << endl;
return 0;
}
}
cout << (-1) << endl;
return 0;
}