結果

問題 No.2428 Returning Shuffle
ユーザー 0214sh70214sh7
提出日時 2023-08-13 13:36:50
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 532 ms / 2,000 ms
コード長 2,086 bytes
コンパイル時間 2,167 ms
コンパイル使用メモリ 218,964 KB
実行使用メモリ 50,600 KB
最終ジャッジ日時 2024-11-23 19:56:32
合計ジャッジ時間 6,783 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 310 ms
26,880 KB
testcase_01 AC 524 ms
50,596 KB
testcase_02 AC 532 ms
50,600 KB
testcase_03 AC 2 ms
5,248 KB
testcase_04 AC 2 ms
5,248 KB
testcase_05 AC 2 ms
5,248 KB
testcase_06 AC 2 ms
5,248 KB
testcase_07 AC 2 ms
5,248 KB
testcase_08 AC 2 ms
5,248 KB
testcase_09 AC 2 ms
5,248 KB
testcase_10 AC 2 ms
5,248 KB
testcase_11 AC 2 ms
5,248 KB
testcase_12 AC 2 ms
5,248 KB
testcase_13 AC 2 ms
5,248 KB
testcase_14 AC 2 ms
5,248 KB
testcase_15 AC 2 ms
5,248 KB
testcase_16 AC 2 ms
5,248 KB
testcase_17 AC 2 ms
5,248 KB
testcase_18 AC 2 ms
5,248 KB
testcase_19 AC 409 ms
31,120 KB
testcase_20 AC 394 ms
31,228 KB
testcase_21 AC 2 ms
5,248 KB
testcase_22 AC 2 ms
5,248 KB
testcase_23 AC 1 ms
5,248 KB
testcase_24 AC 415 ms
26,752 KB
testcase_25 AC 408 ms
26,880 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
const long long MOD = 998244353;

int main(void){
    //cin.tie(nullptr);
    //ios::sync_with_stdio(false);
    
    long long N,M;
    cin >> N >> M;
    vector<vector<long long>> S(M);
    for(int i=0;i<M;i++){
        long long t;
        cin >> t;
        S[i].resize(t);
        for(int j=0;j<t;j++){
            cin >> S[i][j];
            S[i][j]--;
        }
    }
    
    //置換を作成する
    vector<long long> F(N);
    for(int i=0;i<N;i++){F[i] = i;}
    vector<long long> inverse = F;

    for(int i=0;i<M;i++){
        int s = S[i].size();
        for(int j=0;j+1<s;j++){
            F[inverse[S[i][j]]] = S[i][j+1];
        }
        F[inverse[S[i][s-1]]] = S[i][0];

        long long tmp = inverse[S[i][s-1]];
        for(int j=s-2;j>=0;j--){
            inverse[S[i][j+1]] = inverse[S[i][j]];
        }
        inverse[S[i][0]] = tmp;
        
    }


    //サイクルの個数を考える
    vector<bool> visited(N,false);
    vector<long long> C;
    for(int i=0;i<N;i++){
        if(visited[i])continue;
        long long now = F[i], num = 1;
        visited[i] = true;
        while(now!=i){
            visited[now] = true;
            now = F[now];
            num++;
        }
        C.push_back(num);
    }
    
    //CのLCMを求める
    map<long long,long long> Map;
    for(long long c:C){
        vector<pair<long long,long long>> E;
        long long k = c;
        for(int i=2;i*i<=c;i++){
            if(k%i==0){
                E.push_back({i,0});
            }
            while(k%i==0){
                k/=i;
                E.back().second++;
            }
        }
        if(k!=1){
            E.push_back({k,1});
        }

        for(pair<long long,long long> p:E){
            Map[p.first] = max(Map[p.first],p.second);
        }
    }

    long long Ans = 1;
    for(auto it = Map.begin();it!=Map.end();it++){
        for(int i=0;i<(it->second);i++){
            Ans = (Ans*(it->first))%MOD;
        }
    }

    //答えを出力する
    cout << Ans << endl;


    return 0;
}
0