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; }