Advertisement
Guest User

Per Shifts

a guest
Oct 9th, 2015
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define MAX 100000
  6. #define mod 1000000007
  7.  
  8. long long store[MAX + 5];
  9.  
  10. void fill_store (void) {
  11.     long long i; store[0] = 1;
  12.     for (i = 1; i <= MAX; i++) store[i] = (i * (store[i - 1] % mod)) % mod;
  13. }
  14.  
  15. int parity (long long perm[], int len) {
  16.     int check[len + 5], j; int cycle = 1;
  17.     memset(check, 0, sizeof check); int res = 0;
  18.     for (j = 1; j <= len; j++) {
  19.         if (check[j] == 0) {
  20.         check[j] = 1; cycle++; int k = j;
  21.         while (check[perm[k]] == 0) {
  22.         check[perm[k]] = 1;
  23.         k = perm[k];
  24.         cycle++;
  25.         }
  26.         res += (cycle % 2);
  27.         cycle = 1;
  28.     }
  29.     }
  30.     return res % 2;
  31. }
  32.  
  33. // incomplete
  34. long long index (long long perm[], int len) {
  35.     long long res = 0;
  36.     for (int j = 1; j <= len; j++)
  37.         res += (((perm[j] - 1) * store[len - j]) % mod);
  38.     return res % mod;
  39. }
  40.  
  41. bool is_circ (long long A[], long long B[], int len) {
  42.     long long AA[len + len + 5], k, one;
  43.     for (k = 1; k <= len; k++) {
  44.         AA[k] = A[k]; AA[len + k] = A[k];
  45.         if (A[k] == 1) one = k;
  46.     }
  47.     bool res = true;
  48.     for (k = one; k < one + len; k++) {
  49.         if (AA[k] != B[k]) {
  50.             res = false;
  51.             break;
  52.         }
  53.     }
  54.     return res;
  55. }
  56.  
  57. int main() {
  58.     fill_store();
  59.     int i, T, N, K; long long P[MAX + 5], Q[MAX + 5];
  60.     scanf("%d", &T); while (T--) {
  61.         scanf("%d %d", &N, &K); bool flag = true;
  62.         for (i = 1; i <= N; i++) scanf("%lld", P + i);
  63.         for (i = 1; i <= N; i++) {
  64.             scanf("%lld", Q + i);
  65.             if (flag && Q[i] != P[i]) flag = false;
  66.         }
  67.         int parP = parity(P, N), parQ = parity(Q, N);
  68.         long long lex = index(Q, N);
  69.         if (K == 1) printf("%lld\n", flag ? lex : -1);
  70.         else if (K == N) printf("%lld\n", is_circ(P, Q, N) ? Q[1] : -1);
  71.         else if (K % 2) printf("%lld\n", parP == parQ ? lex/2 : -1);
  72.         else printf("%lld\n", lex);
  73.     }
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement