求助(报以关注)
查看原帖
求助(报以关注)
590925
_x_y_楼主2022/10/27 21:05

思路就是第一篇题解的思路,处理出阶乘和逆元,然后用公式计算,然而不知道哪错了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int N = 2e3 + 10;
const int mod = 1e9 + 7;
int n, cnt[26];
long long jc[N], ny[N];
long long qpow(long long b, long long p){
    if(p == 0)
        return 1;
    long long x = 1;
    for(; p; b *= b, b %= mod, p >>= 1)
        if(p & 1)
            x = x * b % mod;
    return x;
}
int js(){
    int num = 0;
    for(int i = 0; i < 26; i++)
        if(cnt[i] % 2 == 1)
            num++;
    return num;
}
int main(){
    jc[0] = 1;
    cin >> n;
    for(int i = 1; i <= n; i++){
        char ch;
        cin >> ch;
        cnt[ch - 'a']++;
        jc[i] = jc[i-1] * i;
    }
    //for(int i = 0; i < 26; i++)
    //  printf("%c: %d\n", 'a' + i, cnt[i]);
    ny[n] = qpow(jc[n], mod - 2);
    for(int i = n - 1; i >= 0; i--)
        ny[i] = ny[i + 1] * (i + 1) % mod;
    if(js() > 1){
        cout << jc[n] << endl;
        return 0;
    }
    int odd = 1;
    for(int i = 0; i < 26; i++)
        if(cnt[i] % 2 == 1)
            odd = cnt[i];
   //所有cnt都为偶数时odd=1
    long long tans = jc[n / 2] * odd % mod;
    for(int i = 0; i < 26; i++)
        tans = tans * jc[cnt[i]] % mod * ny[cnt[i] / 2] % mod;
    cout << (jc[n] - tans + mod) % mod << endl;
    return 0;
}
2022/10/27 21:05
加载中...