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;
}

浙公网安备 33010602011771号