結果
| 問題 |
No.261 ぐるぐるぐるぐる!あみだくじ!
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-07-22 12:47:33 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,621 bytes |
| コンパイル時間 | 674 ms |
| コンパイル使用メモリ | 64,764 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-08 11:46:38 |
| 合計ジャッジ時間 | 1,934 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 33 |
ソースコード
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
inline ll mod_inverse(ll a, ll m){
ll b = m, u = 1, v = 0;
while (b) {
ll t = a / b;
swap(a -= t * b, b);
swap(u -= t * v, v);
}
return (u % m + m) % m;
}
inline ll gcd(ll a, ll b){
if(b == 0){
return a;
}
return gcd(b, a % b);
}
pair<ll, ll> linear_congruence(const vector<ll>& A, const vector<ll>& B, const vector<ll>& M){
ll x = 0, m = 1;
for(int i=0;i<(int)A.size();i++){
ll a = A[i] * m, b = B[i] - A[i] * x, d = gcd(M[i], a);
if(b % d != 0){
return make_pair(0, -1);
}
ll t = b / d * mod_inverse(a / d, M[i] / d) % (M[i] / d);
x = x + m * t;
m *= M[i] / d;
}
return make_pair(x % m, m);
}
int main(){
int N, K;
cin >> N >> K;
vector<int> nxt(N);
for(int i=0;i<N;i++)nxt[i] = i;
for(int i=0;i<K;i++){
int X, Y;
cin >> X >> Y;
swap(nxt[X-1], nxt[Y-1]);
}
int Q;
cin >> Q;
while(Q--){
vector<int> A(N);
for(int i=0;i<N;i++){
cin >> A[i];
--A[i];
}
bool valid = true;
vector<ll> B(N), M(N);
for(int i=0;i<N;i++){
int x = i;
int d = -1;
int size = 0;
for(;;){
if(x == A[i]){
d = size;
}
++size;
x = nxt[x];
if(x == i){
break;
}
}
if(d == -1){
valid = false;
break;
}
B[i] = d;
M[i] = size;
}
if(!valid){
cout << -1 << endl;
continue;
}
auto res = linear_congruence(vector<ll>(N, 1), B, M);
if(res.second == -1){
cout << -1 << endl;
} else {
if(res.first == 0){
cout << res.second << endl;
} else {
cout << res.first << endl;
}
}
}
return 0;
}