90分 WA#5 求条
查看原帖
90分 WA#5 求条
465055
1004779564bzbjj楼主2024/8/6 19:01

计算公式与本题目前第一篇题解相同,即:

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;
}
2024/8/6 19:01
加载中...