QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#97589#5820. 置换AbdelmagedNour100 ✓7ms3588kbC++201.8kb2023-04-17 11:38:582023-04-17 11:39:02

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-04-17 11:39:02]
  • 评测
  • 测评结果:100
  • 用时:7ms
  • 内存:3588kb
  • [2023-04-17 11:38:58]
  • 提交

answer

#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const int N=5000,mod=998244353;
typedef long long ll;
ll Fact[N+5],inv[N+5];
ll inverse(int x){
    return inv[x]*Fact[x-1]%mod;
}
void pre(){
    Fact[0]=Fact[1]=inv[0]=inv[1]=1;
    for(int i=2;i<=N;i++){
        Fact[i]=i*Fact[i-1]%mod;
        inv[i]=mod-mod/i*inverse(mod%i)%mod;
        inv[i]=inv[i]*inv[i-1]%mod;
    }
}
ll Power(ll x,ll n){
    ll res=1;
    while(n){
        if(n&1)res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}
ll C(ll n,ll r){
    return Fact[n]*inv[n-r]%mod*inv[r]%mod;
}
ll Calc(ll n,ll k,ll len){//merge k cycles with length len from n cycles;
    return C(n-1,k-1)*Fact[k-1]%mod*Power(len,k-1)%mod;
}
ll Solve(ll n,ll m,ll K){//n cycles of length m
    ll dp[n+1]={};
    dp[0]=1;
    vector<int>v;
    for(int i=1;i<=n;i++){
        if(__gcd(m*i,K)==i)v.push_back(i);
    }
    for(int i=1;i<=n;i++){
        for(auto&j:v){
            if(j>i)break;
            dp[i]+=dp[i-j]*Calc(i,j,m)%mod;
        }
        dp[i]%=mod;
    }
    return dp[n];
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    pre();
    int t;
    cin>>t;
    while(t--){
        int n,K;
        cin>>n>>K;
        int a[n],vis[n]={},freq[n+1]={};
        for(int i=0;i<n;i++)cin>>a[i],a[i]--;
        for(int i=0;i<n;i++){
            if(vis[i])continue;
            int x=i,sz=0;
            while(!vis[x]){
                sz++;
                vis[x]=1;
                x=a[x];
            }
            freq[sz]++;
        }
        ll res=1;
        for(int i=1;i<=n;i++){
            if(freq[i])res=res*Solve(freq[i],i,K)%mod;
        }
        cout<<res<<"\n";
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 10
Accepted
time: 2ms
memory: 3432kb

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
56
505
16
721
16
0
11264
1
396

result:

ok 10 lines

Test #2:

score: 10
Accepted
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
6224
1
25
25
1
256
1
2052

result:

ok 10 lines

Test #3:

score: 10
Accepted
time: 2ms
memory: 3420kb

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:

256
0
1
1
1
145
0
16
0
1072

result:

ok 10 lines

Test #4:

score: 10
Accepted
time: 2ms
memory: 3484kb

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
656150888
0
81372935
449319403
668622514
0
197618537

result:

ok 10 lines

Test #5:

score: 10
Accepted
time: 2ms
memory: 3436kb

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
544069454
632190035
152238854
0
0
0
0
0
516424712

result:

ok 10 lines

Test #6:

score: 10
Accepted
time: 0ms
memory: 3428kb

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
860677875
959811756
321535122
338992584
1
612643713

result:

ok 10 lines

Test #7:

score: 10
Accepted
time: 7ms
memory: 3588kb

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
786737927
0
0
763158174
313494335
0
115362240
0
812621299

result:

ok 10 lines

Test #8:

score: 10
Accepted
time: 5ms
memory: 3572kb

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
906525565
0
828991020
934355630
0
0
0
292138865

result:

ok 10 lines

Test #9:

score: 10
Accepted
time: 3ms
memory: 3484kb

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
207595358
0
0
866344799
0
0
0
0
296522134

result:

ok 10 lines

Test #10:

score: 10
Accepted
time: 5ms
memory: 3584kb

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
705667952
269633609
0
0
0
0
134859407

result:

ok 10 lines

Extra Test:

score: 0
Extra Test Passed