疑问!!!求助!!!

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

分子分母抵消了
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


|