P5684 [CSP-J2019 江西] 非回文串

 :::cnt[]>>1==0 ->fac[0]=ifac[0]=1;

#include<cstdio> 
#include<algorithm>
#include<cstring>
#define ll long long
#define N 2003
#define reg register
#define p 1000000007
using namespace std;

inline int power(int a,int t){
    int res = 1;
    while(t){
        if(t&1) res =1ll*res*a%p;
        a = 1ll*a*a%p;
        t >>= 1;
    }
    return res;
}

int n,ans,dec,odd;
char a[N];
int fac[N],ifac[N],cnt[26];

int main(){
    scanf("%d",&n);
    scanf("%s",a+1);
    ifac[0] = ifac[1] = fac[0] = fac[1] = 1;
    for(reg int i=2;i<=n;++i) fac[i] = 1ll*fac[i-1]*i%p;
    
    ifac[n] = power(fac[n],p-2);
    for(reg int i=n-1;i>1;--i) ifac[i] = 1ll*ifac[i+1]*(i+1)%p;
    
    for(reg int i=1;i<=n;++i) ++cnt[a[i]-'a'];
    for(reg int i=0;i<26;++i) odd += cnt[i]&1;
    if(odd>1){
        printf("%d",fac[n]);
        return 0;
    }
    odd = 1;
    for(reg int i=0;i<26;++i)
        if(cnt[i]&1) odd = cnt[i];
    dec = 1ll*fac[n>>1]*odd%p;
    
    for(reg int i=0;i<26;++i) cnt[i] >>= 1;//可能cnt[i]==1
    for(reg int i=0;i<26;++i) dec = 1ll*dec*fac[cnt[i]<<1]%p*ifac[cnt[i]]%p;
    ans = (fac[n]-dec+p)%p;
    printf("%d",ans);
    return 0;
}

 

posted @ 2023-09-03 10:09  JMXZ  阅读(70)  评论(0)    收藏  举报