CSES - Leirikisa 4 - Results
Submission details
Task:paleta
Sender:eXeP
Submission time:2016-08-01 17:57:07 +0300
Language:C++
Status:READY
Result:0
Feedback
groupverdictscore
#10
Test results
testverdicttime
#1ACCEPTED0.05 sdetails
#2ACCEPTED0.06 sdetails
#3ACCEPTED0.06 sdetails
#40.05 sdetails
#5ACCEPTED0.05 sdetails
#60.06 sdetails
#70.06 sdetails
#80.06 sdetails
#90.07 sdetails
#100.05 sdetails
#11ACCEPTED0.06 sdetails
#120.06 sdetails
#13ACCEPTED0.06 sdetails
#140.06 sdetails
#150.05 sdetails
#160.06 sdetails
#170.06 sdetails
#180.07 sdetails
#19ACCEPTED0.06 sdetails
#200.20 sdetails
#21ACCEPTED0.06 sdetails
#220.20 sdetails
#230.06 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:25:7: warning: unused variable 'tn' [-Wunused-variable]
   int tn = 4, tk = 3;
       ^
input/code.cpp:25:15: warning: unused variable 'tk' [-Wunused-variable]
   int tn = 4, tk = 3;
               ^

Code

#include <bits/stdc++.h>

#define i64 long long
#define u64 unsigned long long
#define i32 int
#define u32 unsigned int

#define pii pair<int, int>
#define pll pair<long long, long long>

#define ld long double
#define defmod 1000000007

#define mati64(a,b) vector<vector<i64>>(a, vector<i64>(b, 0));
using namespace std;

i64 n, k;
int f[1010101];
int c[1010101];
int d1[1010101];
int t1[1010101];
int main(){
  cin.sync_with_stdio(0);
  cin.tie(0);
  int tn = 4, tk = 3;
  
  
  cin >> n >> k;
  for(int i = 0; i < n; ++i){
    cin >> f[i+1];
    c[f[i+1]]++;
  }
  i64 ans = 1;
  int cn = 0;
  for(int i = 1; i <= n; ++i){
    if(c[i] || d1[i])
      continue;
    cn++;
    int cur = i;
    int time = 1;
    while(d1[cur] == 0){
      d1[cur] = cn;
      t1[cur] = time;
      cur = f[cur];
      time++;
    }
    if(d1[cur] != cn){
      if(time > 1){
	ans = (ans*(k-1))%defmod;
	time--;
      }
      if(time > 1){
	ans = (ans*(k-1))%defmod;
	time--;
      }
      while(time > 1){
	ans = (ans*(k-2))%defmod;
	time--;
      }
    }
    else{
      int ek = t1[cur]-1, cyc = time-t1[cur];
      if(ek > 0){
	ans = (ans*(k-1))%defmod;
	ek--;
      }
      if(ek > 0){
	ans = (ans*(k-1))%defmod;
	ek--;
      }
      while(ek > 0){
	ans = (ans*(k-2))%defmod;
	ek--;
      }
      ans = (ans*(k))%defmod;
      cyc--;
      if(cyc > 0)
	ans = (ans*(k-1))%defmod;
      cyc--;
      while(cyc > 0){
	ans = (ans*(k-2))%defmod;
	cyc--;
      }
    }
  }
  
  for(int i = 1; i <= n; ++i){
    if(d1[i])
      continue;
    cn++;
    int cur = i;
    int time = 1;
    while(d1[cur] == 0){
      d1[cur] = cn;
      t1[cur] = time;
      cur = f[cur];
      time++;
    }
    if(d1[cur] != cn){
      while(time > 1){
	ans = (ans*(k-1))%defmod;
	time--;
      }
    }
    else{
      int ek = t1[cur]-1, cyc = time-t1[cur];
      if(ek > 0){
	ans = (ans*(k-1))%defmod;
	ek--;
      }
      if(ek > 0){
	ans = (ans*(k-1))%defmod;
	ek--;
      }
      while(ek > 0){
	ans = (ans*(k-2))%defmod;
	ek--;
      }
      ans = (ans*(k))%defmod;
      cyc--;
      if(cyc > 0)
	ans = (ans*(k-1))%defmod;
      cyc--;
      while(cyc > 0){
	ans = (ans*(k-2))%defmod;
	cyc--;
      }
    }
  }
  cout << ans << endl;
  return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
2 3
2 1

correct output
6

user output
6

Test 2

Verdict: ACCEPTED

input
3 4
2 3 1

correct output
24

user output
24

Test 3

Verdict: ACCEPTED

input
3 4
2 1 1

correct output
36

user output
36

Test 4

Verdict:

input
10 4
3 10 7 9 1 4 8 5 6 2

correct output
69120

user output
27648

Test 5

Verdict: ACCEPTED

input
10 2
9 4 2 5 8 10 6 3 1 7

correct output
0

user output
0

Test 6

Verdict:

input
20 6
15 16 6 12 8 2 11 4 14 17 8 11...

correct output
749062329

user output
999455687

Test 7

Verdict:

input
10 3
10 7 6 5 9 2 3 6 4 1

correct output
1296

user output
432

Test 8

Verdict:

input
100 6
70 62 57 34 87 73 81 45 11 25 ...

correct output
170647921

user output
864810153

Test 9

Verdict:

input
5 7
2 3 4 5 5

correct output
9072

user output
6300

Test 10

Verdict:

input
200 13
88 97 79 1 184 104 127 159 157...

correct output
798243726

user output
412211138

Test 11

Verdict: ACCEPTED

input
5 2
1 2 3 4 5

correct output
32

user output
32

Test 12

Verdict:

input
1000 17
321 466 231 684 53 480 95 61 5...

correct output
799039396

user output
353295486

Test 13

Verdict: ACCEPTED

input
5 1
1 2 3 4 5

correct output
1

user output
1

Test 14

Verdict:

input
2000 27
545 945 734 555 1974 1119 694 ...

correct output
87259530

user output
166697887

Test 15

Verdict:

input
5 4
2 3 4 5 1

correct output
240

user output
96

Test 16

Verdict:

input
20000 207
4712 13482 9751 10677 2744 326...

correct output
920405949

user output
275373823

Test 17

Verdict:

input
10 9
2 3 4 5 6 7 8 9 10 1

correct output
73741825

user output
415065672

Test 18

Verdict:

input
100000 137
35216 66352 76631 39149 68563 ...

correct output
873619169

user output
784582198

Test 19

Verdict: ACCEPTED

input
5 2
2 1 3 4 5

correct output
16

user output
16

Test 20

Verdict:

input
1000000 1337
157667 207184 572776 559466 52...

correct output
815275681

user output
546842777

Test 21

Verdict: ACCEPTED

input
5 2
2 3 4 5 1

correct output
0

user output
0

Test 22

Verdict:

input
1000000 137037
302969 577811 4130 64 558319 7...

correct output
387136640

user output
235016235

Test 23

Verdict:

input
6 2
2 3 4 5 6 1

correct output
2

user output
0