---
# System prepended metadata

title: C. Circular Mirror

---

# 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;
}
```
:::