QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#104599#5820. 置换Alkaid0 7ms3664kbC++142.3kb2023-05-11 11:43:512023-05-11 11:43:53

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-11 11:43:53]
  • 评测
  • 测评结果:0
  • 用时:7ms
  • 内存:3664kb
  • [2023-05-11 11:43:51]
  • 提交

answer

#include <bits/stdc++.h>
#define N 3010
#define int long long

using namespace std;

const int mod = 998244353;

int t, n, m, k, a[N], dp[N], vis[N], cnt[N];
vector <int> arr;

namespace Math {
    
    const int M = 3000;

    int fac[N], ifac[N];

    inline void add(int &x, int y) {
        x = (x + y) % mod;
    }

    inline int power(int a, int b) {
        int res = 1;
        while(b) {
            if(b & 1)
                res = res * a % mod;
            a = a * a % mod;
            b >>= 1;
        }
        return res;
    }

    inline void pre() {
        
        fac[0] = ifac[0] = 1;
        for(int i = 1; i <= M; i++)
            fac[i] = fac[i - 1] * i % mod;

        ifac[M] = power(fac[M], mod - 2);
        for(int i = M - 1; i; i--)
            ifac[i] = ifac[i + 1] * (i + 1) % mod;
    
    }

    inline int C(int n, int m) {
        if(n < 0 || m < 0 || n - m < 0)
            return 0;
        return fac[n] * ifac[m] % mod * ifac[n - m] % mod;
    }
}

using namespace Math;

inline int solve(int n, int m) {

    arr.clear();
    memset(dp, 0, sizeof dp);

    for(int i = 1; i <= n; i++)
        if(__gcd(m * i, k) == i)
            arr.push_back(i);

    dp[0] = 1;
    for(int i = 1; i <= n; i++){
        for(int u : arr) {
            if(u > i)
                break;
            dp[i] = dp[i - u] * C(i - 1, u - 1) % mod * fac[u - 1] % mod * power(m, u - 1) % mod;
        }
    }   

    return dp[n];
}

signed main() {

    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    pre();

    cin >> t;
    
    while(t--) {
        
        memset(vis, 0, sizeof vis);
        memset(cnt, 0, sizeof cnt);

        cin >> n >> k;

        for(int i = 1; i <= n; i++)
            cin >> a[i];
        
        for(int i = 1; i <= n; i++) {
            if(vis[i])
                continue;
            int u = i, sz = 0;

            while(!vis[u]){
                vis[u] = 1;
                ++sz;
                u = a[u];
            }
        
            cnt[sz]++;
        }

        int ans = 1;

        for(int i = 1; i <= n; i++)
            if(cnt[i])
                ans = ans * solve(cnt[i], i) % mod;

        cout << ans << endl;
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 3372kb

input:

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

output:

1
24
360
6
720
6
0
5040
1
120

result:

wrong answer 2nd lines differ - expected: '56', found: '24'

Test #2:

score: 0
Wrong Answer
time: 2ms
memory: 3380kb

input:

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

output:

0
0
1260
1
24
24
1
60
1
720

result:

wrong answer 3rd lines differ - expected: '6224', found: '1260'

Test #3:

score: 0
Wrong Answer
time: 0ms
memory: 3540kb

input:

10
6 602552
1 2 3 4 5 6
4 775694
1 2 4 3
6 668467
1 4 2 3 5 6
6 558385
1 2 6 3 4 5
7 832183
4 1 2 3 5 6 7
6 631375
1 2 3 4 5 6
8 519340
1 2 3 5 4 6 7 8
4 636124
1 2 3 4
4 759099
3 1 2 4
7 977752
1 2 3 4 5 6 7

output:

60
0
1
1
1
120
0
6
0
240

result:

wrong answer 1st lines differ - expected: '256', found: '60'

Test #4:

score: 0
Wrong Answer
time: 2ms
memory: 3552kb

input:

10
43 725761
1 2 3 4 5 6 7 8 10 9 11 12 13 15 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
37 542860
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 27 26 28 29 30 31 32 33 34 36 35 37
27 793967
2 1 4 3 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

output:

1
0
1
521425096
0
447152495
233673051
95434112
0
554847021

result:

wrong answer 4th lines differ - expected: '656150888', found: '521425096'

Test #5:

score: 0
Wrong Answer
time: 1ms
memory: 3428kb

input:

10
40 535121
3 1 2 4 5 6 7 8 9 11 10 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
43 660193
1 2 3 4 5 6 7 8 9 10 11 12 13 14 16 15 19 17 18 20 26 21 22 23 24 25 27 28 29 30 34 31 32 33 35 36 37 38 39 40 41 42 43
38 596459
1 2 4 3 5 6 7 8 9 10 11 12 13 15 14 ...

output:

1
404841570
565648511
322880772
0
0
0
0
0
192379424

result:

wrong answer 2nd lines differ - expected: '544069454', found: '404841570'

Test #6:

score: 0
Wrong Answer
time: 2ms
memory: 3576kb

input:

10
33 892596
1 2 6 3 4 5 9 7 8 10 11 12 14 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 32 30 31 33
39 875634
1 2 10 3 4 5 6 7 8 9 11 12 13 14 16 15 17 18 20 19 21 22 23 24 26 25 27 28 29 30 31 32 33 35 34 36 37 38 39
27 856117
1 2 3 4 5 10 6 7 8 9 11 12 13 14 15 16 17 18 20 19 21 24 22 23 25 26 ...

output:

0
0
1
0
384146150
738928701
837902046
567053423
1
162886865

result:

wrong answer 5th lines differ - expected: '860677875', found: '384146150'

Test #7:

score: 0
Wrong Answer
time: 1ms
memory: 3488kb

input:

10
2899 540778
3 1 2 4 5 6 9 7 8 10 11 12 13 14 15 16 17 18 19 20 21 22 24 23 27 25 26 28 29 30 31 32 33 34 35 37 36 38 39 40 41 42 44 43 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 70 68 69 71 72 73 74 75 76 77 78 80 79 81 82 83 89 84 85 86 87 88 90 91 92 93 94 95 96 97 98 ...

output:

0
976757268
0
0
449423429
633276628
0
285746301
0
904125811

result:

wrong answer 2nd lines differ - expected: '786737927', found: '976757268'

Test #8:

score: 0
Wrong Answer
time: 6ms
memory: 3664kb

input:

10
2310 568163
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 26 24 25 27 28 30 29 31 32 33 34 35 36 37 38 39 40 41 46 42 43 44 45 47 48 49 50 51 52 57 53 54 55 56 58 59 61 60 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 ...

output:

1
0
583720777
0
131715625
878388734
0
0
0
171650061

result:

wrong answer 3rd lines differ - expected: '906525565', found: '583720777'

Test #9:

score: 0
Wrong Answer
time: 7ms
memory: 3664kb

input:

10
1564 511376
1 2 3 4 5 6 8 7 9 10 11 12 13 14 15 16 20 17 18 19 21 22 23 24 25 26 28 27 29 30 31 35 32 33 34 36 41 37 38 39 40 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 76 74 75 77 78 82 79 80 81 83 84 85 86 87 88 89 90 91 92 93 94 97 95 96 98 ...

output:

0
852351591
0
0
622537653
0
0
0
0
628538336

result:

wrong answer 2nd lines differ - expected: '207595358', found: '852351591'

Test #10:

score: 0
Wrong Answer
time: 6ms
memory: 3392kb

input:

10
1749 969801
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 34 31 32 33 36 35 37 38 39 40 41 42 43 44 45 46 48 47 49 50 51 54 52 53 55 56 57 58 60 59 61 62 63 64 65 66 67 68 69 70 71 72 73 75 74 76 77 78 79 80 81 82 83 84 85 86 89 87 88 90 91 92 93 94 95 96 97 99 ...

output:

0
0
1
976749785
695197546
0
0
0
0
345181117

result:

wrong answer 4th lines differ - expected: '705667952', found: '976749785'