# C. Circular Mirror
Đề bài : https://codeforces.com/contest/1725/problem/C
Nhận xét : chỉ nên quan tâm những thằng được cặp lại với nhau, tức là 2 thằng nó là đường kính, sau đó đóng tổ hợp vào là được, khá đơn giản.
Code :
:::spoiler
```cpp
#include<bits/stdc++.h>
#include<algorithm>
#include<vector>
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define rev(i, a, b) for (int i = (a); i >= (b); --i)
#define ll long long
#define pii pair<int, int>
#define pb push_back
#define fi first
#define se second
using namespace std;
const int mxn = 3e5 + 5;
const ll MOD = 998244353;
int n, m;
ll fac[mxn];
ll pow_mod(ll a, ll b)
{
ll res = 1;
while(b)
{
if (b&1) (res *= a)%=MOD;
b >>= 1;
(a *= a)%=MOD;
}
return res;
}
ll C(ll n, ll k)
{
if (k > n) return 0;
return fac[n]*pow_mod(fac[n - k], MOD - 2)%MOD*pow_mod(fac[k], MOD - 2)%MOD;
}
ll d[mxn];
int main(){
//freopen("H:\\file_txt\\input.txt", "r", stdin);
//freopen("H:\\file_txt\\output.txt", "w", stdout);
fac[0] = 1;
rep(i, 1, mxn - 5) fac[i] = fac[i - 1]*(ll)i%MOD;
scanf("%d%d", &n, &m);
ll sum = 0;
set<ll> pos;
rep(i, 1, n)
{
//cin >> as[i];
scanf("%lli", &d[i]);
pos.insert(sum);
sum += d[i];
}
ll len = sum;
if (len&1)
{
cout << pow_mod(m, n);
return 0;
}
sum = 0;
ll total = 0;
rep(i, 1, n)
{
if (pos.find(sum + len/2) != pos.end())
++total;
sum += d[i];
}
ll res = 0;
rep(i, 0, total)
{
ll remain = total - i;
ll color = m - i;
ll de = n - total*2;
res += C((ll)m, i)*fac[i]%MOD*C(total, (ll)i)%MOD*pow_mod(C(color, 2ll), remain)%MOD*pow_mod(2ll, remain)%MOD*pow_mod(color, de)%MOD;
res %= MOD;
}
cout << res;
}
```
:::