哪个大佬能救救小白,50分就是过不了
查看原帖
哪个大佬能救救小白,50分就是过不了
993356
haoyijie楼主2024/7/16 20:01
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define lll __int128
#define pb emplace_back
#define INF_INT 2e9
#define INF_LLONG 1e18
#define INF_INT_MEMSET_SMALL 0x3f3f3f3f
#define INF_INT_MEMSET_BIG 0x7f7f7f7f
using namespace std;

const ll Mod = 1e9 + 7;
const ll N = 2005;
ll n;
ll total;
char s[N];
ll A[N][N], C[N][N];
ll cnt[N];


void init()
{
    A[0][0] = 1;
    for (ll i = 1; i <= n; i++) {
        A[i][0] = 1;
        for (ll j = 1; j <= i; j++) {
            A[i][j] = A[i][j - 1] * j;
        }
    }
    /*
    for (ll i = 1; i <= n; i++) {
        for (ll j = 1; j <= i; j++) {
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
    */
    for (ll i = 0; i <= n; i++) {
        for (ll j = 0; j <= n; j++) {
            if (j == 0 || i == j)
                C[i][j] = 1;
            else 
                C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % Mod;
        }
    }
    for (ll i = 1; i <= n; i++) {
        cnt[(ll)s[i]]++;
    }
    /*
    for (ll i = 1; i <= n; i++) {
        cout << s[i] << " : " << cnt[(ll)s[i]] << "\n";
    }
    */
}

void work()
{
    cin >> n;
    cin >> (s + 1);
    init();
    /*
    for (ll i = 1; i <= n; i++)
        cout << s[i];
    */
    total = A[n][n];
    ll tn = n / 2;
    ll tmp = 1, x = 0;
    for (char i = 'a'; i <= 'z'; i++) {
        if (cnt[(ll)i]) {
            x += (cnt[(ll)i] % 2);
            ll cur = cnt[(ll)i] / 2;
            tmp = tmp * C[tn][cur] % Mod * A[cnt[(ll)i]][cnt[(ll)i]] % Mod;
            tn -= cur;
        }
    }
    if (x > 1) {
        cout << total % Mod;
    } else {
        cout << ((total - tmp) + Mod) % Mod;
    }
    return;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    work();
    return 0;
}
2024/7/16 20:01
加载中...