计算公式与本题目前第一篇题解相同,即:
A(n+2,n+2)*A(m,m)*C(n+3,m)-2*(A(n+1,n+1)*A(m,m)*C(n+2,m))
经过整理,发现A与C可以合并,得到:
A(n+2,n+2)*A(n+3,m)-2*(A(n+1,n+1)*A(n+2,m))
已经通过90分,说明公式应该没有问题
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ans1[114514],ans2[114514];
ll num1[114514],num2[114514];//存储答案要乘的数值
ll n,m;
//ans=ans1-2*ans2
int main(){
cin>>n>>m;
for(int i=1;i<=n+2;i++){
num1[i]++;
}
for(int i=n+3;i>=n+3-m+1;i--){
num1[i]++;
}
for(int i=1;i<=n+1;i++){
num2[i]++;
}
for(int i=n+2;i>=n+2-m+1;i--){
num2[i]++;
}
ans1[1]=1;ans2[1]=1;
for(int i=1;i<=25600;i++){
if(num1[i]==0)num1[i]=1;
else if(num1[i]==1)num1[i]=i;
else if(num1[i]==2)num1[i]=i*i;
if(num2[i]==0)num2[i]=1;
else if(num2[i]==1)num2[i]=i;
else if(num2[i]==2)num2[i]=i*i;
//cout<<i<<" "<<num1[i]<<" "<<num2[i]<<endl;
}
//1 高精度乘法
for(int i=1;i<=25600;i++){
if(num1[i]==1&&i>100)continue;
for(int j=1;j<=25600;j++){
ans1[j]*=num1[i];
}
for(int j=1;j<=25600;j++){
ans1[j+1]+=ans1[j]/10;
ans1[j]%=10;
}
}
//cout<<ans1[1]<<ans1[2]<<ans1[3]<<endl;
//2 高精度乘法
for(int i=1;i<=25600;i++){
if(num2[i]==1&&i>100)continue;
for(int j=1;j<=25600;j++){
ans2[j]*=num2[i];
}
for(int j=1;j<=25600;j++){
ans2[j+1]+=ans2[j]/10;
ans2[j]%=10;
}
}
//cout<<ans2[1]<<ans2[2]<<ans2[3]<<endl;
//end 计算输出的值
for(int q=1;q<=2;q++)//按照公式进行两次减法
for(int i=1;i<=25600;i++){
ans1[i]-=ans2[i];
if(ans1[i]<0){
ans1[i+1]--;
ans1[i]+=10;
if(ans1[i]<0){
ans1[i+1]--;
ans1[i]+=10;
}
}
}
bool fl=0;
for(int i=25600;i>=1;i--){
if(ans1[i]!=0)fl=1;
if(fl){
cout<<ans1[i];
}
}
if(fl==0)cout<<0;//如果值为零
return 0;
}