Loading

Atcoder Beginner Contest (ABC) 470 题解

C

脑筋急转弯题。

考虑分析势能 \(sum = \sum a\),那么 \(sum\)\(\mathcal{O}(n)\) 的。那么我们只需要随便拿一个容器维护那些 \(> 0\) 的数,暴力减即可,最多减去 \(\mathcal{O}(n)\) 次。

#include <bits/stdc++.h>
#define int long long
#define Misaka namespace
#define Network std
using Misaka Network;

const int N = 5e5 + 7;
set<int> vec;
int n, q, a[N], ans;

signed main(){
  ios::sync_with_stdio(0), cin.tie(0);
  
  cin >> n >> q;
  while(q --){
    int opt, x; cin >> opt;
    if(opt == 1){
      cin >> x;
      ans ^= a[x], a[x] ++;
      if(a[x] == 1) vec.insert(x);
      ans ^= a[x];
    }
    else{
      vector<int> del;
      for(int x: vec){
        ans ^= a[x];
        a[x] --, ans ^= a[x];
        if(!a[x]) del.push_back(x);
      }
      for(int x: del) vec.erase(x);
    }
    cout << ans << "\n";
  }
  
  return 0;
}

D

这题我一开始还被卡了一会。

我们手玩就能发现,其实操作 \(2\) 就是把 \(p\) 换成 \(p^{-1}\)。所以如果只有操作 \(2\) 的话,当前排列 \(g\) 其实就是在 \(p\)\(p^{-1}\) 之间反复切换。

加入操作 \(1\),我们发现对于两点值的交换,在 \(p\)\(p^{-1}\) 上都可以 \(\mathcal{O}(1)\) 实现。于是依题意模拟即可。

#include <bits/stdc++.h>
#define int long long
#define Misaka namespace
#define Network std
using Misaka Network;

const int N = 5e5 + 7;
int n, a[2][N], idx, q;

signed main(){
  ios::sync_with_stdio(0), cin.tie(0);
  
  cin >> n >> q;
  for(int i = 1; i <= n; i ++){
    cin >> a[0][i];
    a[1][a[0][i]] = i;
  }

  while(q --){
    int opt; cin >> opt;
    if(opt == 2) idx = 1 - idx;
    else{
      int i, j; cin >> i >> j;
      swap(a[idx][i], a[idx][j]);
      int opp = 1 - idx;
      a[opp][a[idx][i]] = i;
      a[opp][a[idx][j]] = j;
    }
  }

  for(int i = 1; i <= n; i ++) cout << a[idx][i] << " ";
  cout << "\n";
  
  return 0;
}

E

概率模板题,但是感觉概率属于不怎么熟的一块。

首先考虑一下最优策略:在不知道的牌里随便开一张,如果这张之前见过,那么直接配对。如果没见过,再随便开一张。

这个过程其实可以看作在集合内的操作,数的顺序是无关紧要的。所以这其实等价于 \(a_i \leftarrow \overline{a}\),这样所有元素的值就一样了,不需要状压了。

设计 DP 状态 \(f(i,j,k)\) 代表剩余 \(i\) 条命,已经配对 \(j\) 对,已经知道但没配对 \(k\) 张的期望得分。我们只需要按照最优策略暴力转移即可。

细节:概率题一般记忆化搜索更好写,记得死亡要在得分前判定。

#include <bits/stdc++.h>
#define int long long
#define Misaka namespace
#define Network std
using Misaka Network;

const int N = 207;
double f[N][N][N], a[N], avg;
int n, l;

double dfs(int i, int j, int k){
  if(j == n || i == 0) return f[i][j][k] = j * avg;
  if(f[i][j][k] != -1) return f[i][j][k];
  f[i][j][k] = 0; int lft = 2 * n - 2 * j - k;
  if(k > 0) f[i][j][k] += 1.0 * k / lft * dfs(i, j + 1, k - 1);
  if(j + k < n){
    double res = 1.0 * (lft - k) / lft;
    lft --;
    f[i][j][k] += res / lft * dfs(i, j + 1, k);
    if(k > 0) f[i][j][k] += res * k / lft * dfs(i - 1, j + (i - 1 > 0), k);
    if(j + k + 1 < n) f[i][j][k] += res * 2 * (n - j - k - 1) / lft * dfs(i - 1, j, k + 2);
  }
  return f[i][j][k];
}

signed main(){
  ios::sync_with_stdio(0), cin.tie(0);
  
  cin >> n >> l;
  for(int i = 1; i <= n; i ++) cin >> a[i], avg += a[i];
  avg /= n;

  for(int i = 0; i <= l; i ++){
    for(int j = 0; j <= n; j ++){
      for(int k = 0; k <= n; k ++) f[i][j][k] = -1;
    }
  }
  cout << fixed << setprecision(10) << dfs(l, 0, 0) << "\n";
  
  return 0;
}

F

前置知识(这些我都没学过):

我们考虑一个排列 \(p\),她的逆序对数量为 \(inv\)

接下来对 \(p\) 进行邻项交换,交换次数为 \(cnt_1\)

交换任意相邻两项,\(inv \mod 2\) 的值必然改变,与此同时,\(cnt_1 \mod 2\) 的值也会改变。

所以我们知道 \(inv \equiv cnt_1 \pmod 2\)

那么考虑交换任意两项 \((p_u, p_v)\),我们设从 \([1,2,...,n]\) 开始,交换任意两项的次数为 \(cnt\),我们考虑 \(inv\)\(cnt\) 的变化。

显然 \(p[u...v]\) 的逆序对数量奇偶并没有发生变化(贡献法),\(p[1...u - 1]\)\(p[v + 1...n]\) 的数量没有变。

加上 \((p_u,p_v)\) 这一对逆序状况的改变,那么 \(inv \mod 2\) 一定会变,因此 \(cnt_1 \mod 2\) 也变了。同时,\(cnt \leftarrow cnt + 1\),所以 \(cnt \equiv cnt_1 \equiv inv \pmod 2\)

经过上述推导,我们有:

  • \(inv \equiv cnt \pmod 2\)

  • 因此,如果想要从 \([1,2...,n]\) 达到另一种排列,需要进行的任意项交换次数的奇偶性固定。所以,我们可以把一个排列 \(p\)\(inv \mod 2\) 称作它的奇偶性。一个排列 \(p\) 的奇偶性,就是 \(cnt\) 的奇偶性。并且在 \([1,2,...,n]\) 的所有排列中(\(n \ge 2\)),奇排列和偶排列的数量是各占一半的,因为可以通过交换任意两项达到一一对应。

接下来考虑解决问题:

我们不妨建图,连接每一条 \((a_i, b_i)\) 的双向边。

弱化问题,恰好 \(10^{100}\) 次操作 \(\to\) 任意次操作。这种情况下,每一个连通分量里的字母可以任意排列。因此设这个连通分量大小为 \(s\),字符 \(i\) 出现的次数为 \(cnt_i\),则这个连通分量里的情况数就是 \(\frac{s!}{\prod_{i} cnt_i!}\),我们把这些字符串集叫 \(T\)

考虑恰好 \(10^{100}\) 次操作的情况。由于操作数实在太多了,而当我们达成某个字符串之后,可以不断通过进行偶数次同一条边的操作使字符串保持不变。因此这个东西对我们的约束,其实就是总操作次数为偶数。

我们对每个连通分量分别考虑它的置换 \(p\),这个 \(p\) 其实就是我们上述的,由 \([1,2,...,n]\) 不断交换得来的排列:进行一条边的交换,其实就是 \(p\) 上任意两项进行交换。

那么如果一个连通分量内有两个相同的字母 \(a_{p_u}\)\(a_{p_v}\),那么直接交换 \(p_u,p_v\),字符串不变,但是排列的奇偶性,也就是总操作数的奇偶性可以发生变化。因此,我们可以用这两个字母调整操作次数的奇偶性,那么所有 \(T\) 中的字符串都可以达到。

如果没有连通分量满足有两个一样的字母,那么一定有一半的情况是无法达到的,答案为 \(\frac{|T|}{2}\)。要想到这点有点难,但是样例有提示。

/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%##*++===++***======+*@@@@@@####%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*******+++++++++++==========*+====**===+======**%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*++==================================+++=========+++++##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#*+===========================================+=================**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#++========================================++++++====================++*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*+=============================================++++++**======================+*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*==================================================++*****++++======================+*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*======================================================***++++++=========================+###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*===================================================================++=====================--==+*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%+===============================================================+++======++=======++++==--==+-:.:-==*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%+=====================================================================+====++======++===+*+=-:==*=======*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%+======================================================================++*+==*=====+==-:-===+*+=====+=======*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%+=============================================================*==============#=*+=+=-+====**+===++======*======+#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+================================================================++=====---=--==+-=.:++=++===+++==+++=====++======*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%+=====================================================================+:.......-===+=.......=**++====+++======++======*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+=========================================++=====================-::.:::==--========++*-.........::=++++++=======*======+*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*+==========================================+*=================-:::--=======++==========++=:.........:=+=+**+=======++=====+#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#+===========================================+*==++=========-::-+*============++==========+**:...........:+****====++=++======+*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+++==============================+**+=========+*==*+====*+==-=====+*=============*===========**:..........:-**+*+====*++=*=++====+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+++++===+========================+***+=========++==**+===++=========**+============*=======+===+*-............:+*+*+===**+=++++====+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+++++++++==+===++=================+#**===========*+==**+===*=========+**+========+===+=======++==+*-.............-*+*+==+**+=++**+===+*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#*++++++++++=======================+****============#==+*#+==*==========+**=========+==++=======*+==++:..............****==+***=++*#*====*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%++++++++++++++++++================+**#*=========-===#+=+***==#====*=====***=========+==++=======**==++:..............+*#*==****+++#%#+==+*%@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*+#+*++++++++++++++++=================**#*===-::::======*+=+***+++====+====+***========++==*+=======*++=++:....:=+*=---.:+**+=+****++*#@%#+=+%@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*++#*#++++++++++++++++++++++++=========+##*-::::-========+*+==+*#**====*+====+**+========+===#+=======*++=+=::+*+-........:*#*+=*****++%@@@#*=+%@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%++++*#*+++++++++++++++++++++++=========++==::-=============**===+*##+==+*+===+***+=======++==+*+======++++=+**+:...........-***==#****=+#@@@%*=*%@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*+++*##*+++++++++++++++++++++======++=-:--#==================#+===+*##++=*+====***+=======++==+++======+-*=##=..............+**==******=*#@@@@%+*%@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@#**+**++++++++++++++++++++++++++++======::.:-*#*==================+*+====+*#%+=*++=+**+=======++==++++=====++-%#+=:..............**+=+*****+=#%@@@@#*#@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@*+++++*+++++++++++++++++++++++++++==+=:.::=+++##=============+======+#=======+###*+=+**+=======*+=+=-*====**+--*++-......::......:#+==**#***++%@@@@@##%@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@#+++++++++++++++++++#++++++++++++++=-:::-=++++=+#*============#=+======+*+========+**+***+======+*==*=-*+*#++=--=*+-----::=*#%*+-..=*==+**#***+*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@#+++++++++++++++++++*++++++++++++++-::-=++++====++**+++========++++=======++%*==========++++*****+%*##*++#*==+=---+%*-.:.+%%%##%%%=.:+*=+**##***=#@@@@@%@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@%#+++++++++++++++++++*++++++++++++=:=+++++++++++++++*++==+++====+*+++======+=++***+++=====++++=======++*+-=+==+=:-*+%=::*@%%%#-::-+%%#***+***%#***+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@%*+++++++++++++++++++#+++++++++=-=+++++++++++++++++++*++=+++====+#*++=+==+*+==+=+++**##%%###%###****%+=+---*+=+=::+-*-+%@%####%*..::##=**+***#%#***#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@%*+++++++++++++++++++#+++++++=-+++*+++++++++++++++++++++++*++++++*%++=+++++#*=++=%#+#***+*++*+======**=*---=+=+=..---+%@%##:=##%*. .-#=:******%%****%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@%*+*+++++++++++++++++#+++++=-=++++*++++++++++++*+++++++++++*+++++++#++++++++**+###%**+----*#+*+=====*=+#----#=+=..:---+%%#%%%%##%+. .==.+*****%@%**#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@%#+*+++++++++++++++++#++++-=+++++++#+++++++++++*++++++++++++*+++++*=%+++++++%%%##=-++++----=*+*=====#=+#:---#++-..:---:*#%%%%%%#+%-  :-.:*****%@@%**%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@#+*+++++++++++++++++#+++=+++++++++#++++++++++++#+++++++++++*++++++*=#+++++*%@=++++-=*++----=+*+====#-+%::--*++...:--:.:=%#%%%%%**%. .:..=##**#@@@#*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@#*#+++++++++++++++++#+++++++++++++*%+++++++++++*#+++++++++++*++++++*-*+++#*+*=-=*+*--+*+--=**##++==*-+#::--=*-....-:....*@**-=%++%: ....-##**%%@@%#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@*#+++++++++++++++++#*: :*+==++++++#*+++++++++++##+++++++++++*+++++*=-*%*++++*=--+*+--+%@*+++*#*+==+--%..:-#=....::......=#.  -:=%- ....:##**%@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@%#+++++++++++++++++**   -*  .#++++##+++++++++++*##*++++++++++#+++++*++=+++++++----#%+--=*%+--=#+++=-:#..:---..............  +*##%......:+***%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@%++++++++++++=-++++#        #++++*#*+++++++++++*##++++++++*++*++++#*---=++++*+-=+=-@#++*@%@%**#+*=:.=...:--.................=**-=#*-...-:**%@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@#++++++++++=::=++++#*- -=..+=:+++*##*+++++++++++###*+++++++*++**+++*=----=**++@=-=#@@@@@%#%@@%%#@*-.....:-:...................:::::...::..#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@#++++++++=::-++++++#   =--    =*++###+++++++++++*####+++++++%++##+++*=------+**@@@@@*-::::::-=#%%-......:-................................:*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@#++++++=:::=+++++++#         .=*++##%*+++++++++++*####+++++++**++**+++*-----+%@@@@%%@@+...  ..-*-:......::.................................:+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@%%+++++-:::+++++++++++..#  .**+++++*##%++++++++++++*###%+++++++**++*+*++*--=@@@@%%%%%%%@@.     .-:.......:..................=-:..............:*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@++++:::-=+++++++++++##=   #+=++*+*####++++++++++++*#####++++++*+***==+*%@@@@%%%%%-+%%%%%=     .............................-===.............:#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@#++-:::=+++++++++++++**: :+. :#:  =####+**+++++++++*#####*+++++#-=**#-*#@@@@%%%%@@@@@%%%%-     ...............................+:.............:#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@%++-::=++++++++++++++**+++*. .:.  .*###*+**+++++++++*#####%*++++#=--=%*@@@@@%%%%@@@@@@%*%%:    ...............................:-..............-%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@*+=:-++++++++++++++++#*++#%- -= .+%%###++**++++++++++*####%**+++*+--=#@@#*@%%%#%@@@@@%+*%+    ................................=..............:=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+=-++++++++++++++++++#*+:  .=*     =###++**++++++++++*#####+***+*+-=#@@--#@%#+*#**%@#==%%    ................................:...............-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#+-+++++++++++++++++++#+.          :%##%+++#+++++++++++*####+-=*#*##*@@#::=@@%+.  :-::+%%   .................................................:+%@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*+++++++++++++++++++++%=.:=.  .:..+*####+++**+++++++++++#####=----#@@@@@+. :*-   -**#%%: ....................................................-*@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#++++++++++++++++++++++#++=   :###*+*####*++*#+++*++++++++*###+---:+=:-+##*-.   .:--:..=#*-:.................................................=+@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#++++++++++++++++++++++%**.  :###++*####%++++#*++*#++++++++####=--=-..............:==---....................................................=*@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*++++++++++++++++++++++%++##**##++*#####%#++++#*+++**+++++++*##*----:......................................................................=#@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*++++++++++++++++++++++#++#+*#++++########++++#@*+++#+#+++++*###+::---:...................................................................+#@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*++++++++++++++++++++++#*%+#*++++#######%@*+++##%*++%=-+**++*==*#=:.....................................................:-==+:..........:+@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*++**++++++++++++++++++*%*#+++++#######%@%%++*%##%#+**---:-=##*=:-:.................................................-*%%%%%%-..........-+@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*++#*+++++++++++++++++*#**++*#+########+-=#*++@###@%*#+--:::..:::..............................................:-#%%%%%%%%%-..........:+@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#*+++++++++++++++++#+*+++*%+########--=-+#+**=###=*%%+-::..................................................=****+++++*%@-.........:-%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#*%++++++++++++++++*#+++++%**#######*::----+#**-:%+---+#=-::.............................................:=#+++++-------:..........:*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#@+++++++*++++++++#*++++#+**#######%++#*+=--=+%=::::::------:::.......................................:=*++++=-------::..........:+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*++++++**++++++**+++**+++#######%=-=-::*@+--::=:...:..............................................:**+++++=+**=:...............+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*+++++++**+++++#*++#*++++#%####%#=+-::+=-=+=:.................................................................................=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#++++++++#++++**+##++++++#%####@*-:::===--+++.::::.........................................................................:.:#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*+++++++++*++#**#*+++++++#####%::::::=----=-+-:::::..........................................................................+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%+++#++++++**%#*++++++++++%%##%#=:::::==------++=====:.....................................................................:.-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%++*#++++++*#+++++++++++++%%#%*+++*-:::=+=------====++:.....::..............................................................:-%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*++**+++++++##++++++++++++%%@*++++++*+-::-==++=+-:::-::::...:::................::.........................................:::*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*++#*++*#*++*%#++++++++++*%%++++++++++*##-::::::::::::::::::::::..:::..................................................::::=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#*++#*++*%*++*#%%+++++++++##+++++++++++*#####*+-::::::::::++=-++=-:::......................................:::::....:.:-=*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@**+*#*++*%#++*##%#+++++++++++++++++++++*######@##%%#++##==--------==+=::::.............::.....::::::::::::::::::::=#%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#**+*#*+*##@++*###%#*+++++++++++++++++++*######@#######*=--------------------:::::::::::::::::::::------=+**##%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#****#*+*##%*+*####%#++++++++++++++++++*#######%#####+%*==-------------------------================---=########%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*****#***%#%@**####%@*+++++++++++++++++*#####%#%#####%=+=-------------------------------------------=#######%###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*****%%**#%%%@**#%%###@#*+*+++++*++*++++#####%@#@######*=======-------------------------------------=########@###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*****#@#**%%%%@#**#%###%@#**++++*#++++++*#####%@#@#######+======---------------------------------====*########@###%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*****#@@#*#%%%%@%*#%%%%%%%@*******%+**+++#%###%%@#@######%*===========-==------------------------====+%#######%@####@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#****%@@@#*#%%%@@%*#%%%%%%%%%******%+++++*#%%#%%%@%%%######%@#+============-===-----------------==-==-%########@@%###%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*****%@@@@#*%%%%@@%##%%%%%%%%@%****#@*****#%%%%%%%@%%%%#%####%+--=+++======-=--========---=-==========+%########@@@%##%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#*****#@@@@@%#%%%@@@@##%%%%%%%%%@#***#@*****#%%%%%%%@%%%%%#%####%#-------+**=====================--=====##########@@@%###%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%******%@@@@@@@#%%%@@@@##%%%%%%%%%%@#**%@****#%%%%%%%%@%%%%%#%%%###%*-----------=++++===========---=======#########%@@@@%###@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@%**%%***%@@@@@@@@%%%%@@@@##%%%%%%%%%%%@**%@****%%%%%%%%%@%%@@%%%%##%%%%#--------::::-----=**+==============*#########@@@@@@@##%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@%###@@%***#@@@@@@@@@%%%@@@@@##%%%%%%%%%%%@%#%@***#%%%%%%%%%@%%@@%%%%%%#@###%=------------:::::--::=***+=======*%########@@@@@@@@%#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@%***%@@@@@@@@@@%%@@@@@%#%%%%%%%@%%%#@%%@**#%%%%%%%%%%@%%@@%%%%%%#@######=------------:::-----:::::-==+**#++#%#####@@@@@@@@@%#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@**#@@@@@@@@@@@%%@@@@@%#%%%%%%%@%%%#%%%%**%%%%%%%%%%%%%@%@%%%%%%#@@%####%#---------::::::::::::----------=#=-*%##%@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*#@@@@@@@@@@@@@%@@@@@%%%%%%%%@%%%**@%@**#%%%%%%%%%%@%%@%%%%%%%%%%.:+#%####%*--------::::::::::-------------+--+#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*#@@@@@@@@@@@@@@@@@@@@%%%%@%@@%%@+*%@@*#%%%%%%%%%%%@%@%@@%%%%%%@......-#%####%%+--------++--::::-::--:::::--+-*-*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@%@%%%%+*%@%*%%%%%%%%%%%%%%%@@%%%%%%#:..........:=******##*+--------------------:+==+=-=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%@@@%%%%+*#@*#%%%%%@%%%%%%@@@%%%%%%%+:...............---------:::::---------------+=--=+-=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@@@@@%%#=*%%#%%%%%%@%%%%@@%%%%%%%#=--:::--=++=-:......:---------------------------==---+=--#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@@@@@%%#=*%#%%%%@@@@@@@%%@#@%%%%#=-----::::::::-=++-...:---------------------------+----*--=*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%@@@@@@%%#=*#%%%%%%%@%%%%#--+%%%%#------------::::::::-*-..--------------------------*=----%*--+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%@@@@@@%%#=#%%%%%%%@%%%%#--=@%%@#++===---------::::++=-::-=-:------------------------==----===*=-=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%@@@@@@@@%@+@%%%%%%@%%%%+--+%%%#------------:::::::::::::-=**=+=-----------------------*-----++--@=-*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@%@@%%%%%%@%%%#=-*%%%*=---=++++======--==++=-::-::::-:-=#%+--------------------#-------=+=*#*+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@%%%%%%%%%%+#%%%*--*%*-::..................:-**-::-:::-=++#=-----------------%----------*+++@%+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@%%%%%%@%%#+=--+*+-:.............................:===-----=++**+--------------#@%+-------=++*+=---+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%@@===--+#=:::::::........:=+++=----:::.:--......:=*=--=++++*%=-----------#*%@@*------+=-%=----*@%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%*=-=+-=#-:::--:::::--=++-:.................:==:...:..=+--=+++++**=--------#+++%@@*----=+-=*=----*:+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*/
#include <bits/stdc++.h>
#define int long long
#define Misaka namespace
#define Network std
using Misaka Network;

const int N = 2e5 + 7, MOD = 998244353;
vector<int> g[N];
int n, m, a[N], idx, cnt[N][30], vis[N], frc[N], inv[N], f;

void dfs(int u, int id){
  vis[u] = 1;
  cnt[id][a[u]] ++;
  for(int v: g[u]){
    if(vis[v]) continue;
    dfs(v, id);
  }
}

int qpow(int x, int y){
  int res = 1;
  for(int i = y; i; i >>= 1){
    if(i & 1) (res *= x) %= MOD;
    (x *= x) %= MOD;
  }
  return res;
}
int bin(int x, int y){
  if(x < 0 || y < 0 || x < y) return 0;
  return frc[x] * inv[y] % MOD * inv[x - y] % MOD;
}

signed main(){
  ios::sync_with_stdio(0), cin.tie(0);
  
  cin >> n >> m;

  frc[0] = 1, inv[0] = qpow(frc[0], MOD - 2);
  for(int i = 1; i <= n; i ++){
    frc[i] = frc[i - 1] * i % MOD;
    inv[i] = qpow(frc[i], MOD - 2);
  }

  for(int i = 1; i <= n; i ++){
    char c; cin >> c;
    a[i] = c - 'a' + 1;
  }
  for(int i = 1; i <= m; i ++){
    int u, v; cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }

  for(int i = 1; i <= n; i ++){
    if(vis[i]) continue;
    dfs(i, ++ idx);
  }

  int ans = 1;
  for(int i = 1; i <= idx; i ++){
    int sum = 0;
    for(int j = 1; j <= 26; j ++) sum += cnt[i][j];
    for(int j = 1; j <= 26; j ++){
      if(!cnt[i][j]) continue;
      ans *= bin(sum, cnt[i][j]), ans %= MOD;
      sum -= cnt[i][j];
      if(cnt[i][j] > 1) f = 1;
    }
  }

  if(!f) (ans *= qpow(2, MOD - 2)) %= MOD;
  cout << ans << "\n";
  
  return 0;
}
posted @ 2026-08-09 13:55  Trent900  阅读(61)  评论(3)    收藏  举报