分子分母抵消了
by Phartial @ 2022-11-18 21:16:10
挂一下第一种情况的代码,感谢各位dalao答疑!!!
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10;
const int Mod=1e9+7;
int n,retu,ans=1,p,t[27];
char a[N];
bool l=false;
inline int A(int x,int y){//A(x,y);
int ret=1;
for(int i=0;i<y;i++){
ret=(ret*(x-i))%Mod;
}
return ret;
}
inline int C(int x,int y){
int ret=1;
for(int i=0;i<y;i++){
ret=ret*(x-i)/(i+1)%Mod;
}
return ret;
}
int main()
{
scanf("%d",&n);scanf("%s",&a);
for(int i=n;i>=1;i--){
a[i]=a[i-1];t[a[i]-'a']++;
}
if(n%2==0){//偶数队列长度
for(int i=0;i<26;i++){
if(t[i]%2==1){printf("%d\n",A(n,n)); return 0;}//x/2<1无法分配直接为0
if(t[i]!=0){
ans=ans*C(t[i],t[i]/2)*A(t[i]/2,t[i]/2)%Mod;
}
}
ans=ans*A(n/2,n/2)%Mod;
}else{//奇数队列判断
for(int i=0;i<26;i++){
if(t[i]%2==1&&!l){ans*=(t[i]--);l=true;}
if(t[i]%2==1&&l){printf("%d\n",A(n,n)); return 0;}//只能有一个奇数
if(t[i]!=0){
ans=ans*C(t[i],t[i]/2)*A(t[i]/2,t[i]/2)%Mod;
}
}
ans=(ans*A((n-1)/2,(n-1)/2))%Mod;
}
retu=(A(n,n)-ans)%Mod
printf("%d\n",retu);
return 0;
}
```
by Memory_Lin @ 2022-11-18 21:18:21
$C_{t[i]}^{\frac {t[i]}2}=\dfrac{A_{t[i]}^{\frac {t[i]}2}}{A_{\frac {t[i]}2}^{\frac {t[i]}2}}$
然后就和后面的 $A_{\frac {t[i]}2}^{\frac {t[i]}2}$ 抵消了
by SmallBlack @ 2022-11-18 21:18:54
@[wsfxk](/user/376161) 但是是一次性操作的,那不应该化简前后的值是一样的嘛
by Memory_Lin @ 2022-11-18 21:19:32
@[SmallBlack](/user/185048) 既然可以抵消那前后做法的区别在哪里哇想了好久没想明白qaq
by Memory_Lin @ 2022-11-18 21:21:12
考虑这个式子需要取模
因为你取模后,原来能最后被分母整除的分子部分就不一定能被分母整除了。
所以需要乘法逆元
而后者没有分母,不需要考虑这一情况,所以不需要乘法逆元
by SmallBlack @ 2022-11-18 21:25:20
@[SmallBlack](/user/185048) !!!懂了谢谢!!!
by Memory_Lin @ 2022-11-18 21:26:20
$\Huge 3^{12}$
考古!!!
by gongziwen @ 2023-08-20 11:46:43
烤股 $3^{12}$
by Wu_min @ 2024-08-08 16:50:59
烤股 $3^{12}$
by Wu_min @ 2024-08-08 16:51:15