10pts高精求调
查看原帖
10pts高精求调
923022
Walledjc楼主2024/8/28 20:01

输入11和11输出112112,多输了一个,不知道为什么

#include <bits/stdc++.h>
using namespace std;
int ans[2000010],ans2[2000010];
void gd(int a){
	int len=ans[0];
	for(int i=1;i<=len;i++){
		ans[i]*=a;
	}
	for(int i=1;i<=len;i++){
		ans[i+1]+=ans[i]/10;
		ans[i]*10;
	}
	while(ans[len+1]){
		len++;
		if(ans[len]>=10){
			ans[len+1]+=ans[len]/10;
			ans[len]%10;
		}
	}
	ans[0]=len;
}
void gd2(int a){
	int len=ans2[0];
	for(int i=1;i<=len;i++){
		ans2[i]*=a;
	}
	for(int i=1;i<=len;i++){
		ans2[i+1]+=ans2[i]/10;
		ans2[i]*10;
	}
	while(ans2[len+1]){
		len++;
		if(ans2[len]>=10){
			ans2[len+1]+=ans2[len]/10;
			ans2[len]%10;
		}
	}
	ans2[0]=len;
}
void jf(){
	int len1=ans[0],len2=ans2[0];
	for(int i=1;i<=len2;i++){
		if(ans[i]>=ans2[i]){
			ans[i]-=ans2[i];
		}
		else{
			ans[i+1]-=1;
			ans[i]=ans[i]+10-ans2[i];
		}
	}
	while(ans[len2+1]<0){
		len2++;
		ans[len2]+=10;
		ans[len2+1]-=1;
	}
}
int main(){
	int n,m;
	cin>>n>>m;
	ans[0]=ans2[0]=1;
	ans[1]=1;
	ans2[1]=2;
	for(int i=n+3;i>n+3-m;i--){
		gd(i);
	}
	for(int i=1;i<=n+2;i++){
		gd(i);
	}
	for(int i=n+2;i>n+2-m;i--){
		gd2(i);
	}
	for(int i=1;i<=n+1;i++){
		gd2(i);
	}
	jf();
	for(int i=ans[0];i>=1;i--) cout<<ans[i];
	return 0;
} 
2024/8/28 20:01
加载中...