社区讨论

爆0求助

P1009[NOIP 1998 普及组] 阶乘之和参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m0dyx1kv
此快照首次捕获于
2024/08/28 22:45
2 年前
此快照最后确认于
2025/11/04 22:08
4 个月前
查看原帖
rt,以下是我的代码,本人之前没学过高精,恳请指点
CPP
#include<bits/stdc++.h>
using namespace std;
const int pp=5e6+7;
int s[pp],x[pp],ans[pp],c[pp],n;
int main( ){
	cin>>n;
	ans[1]=1;
	int xlen=1;
	x[1]=1;
	for(int i=2;i<=n;i++){
		int xx=i,cnt=0;
		while(xx){
			s[++cnt]=xx%10;
			xx/=10;
		}
		int slen=cnt;
		for(int l=1;l<=xlen;l++){
			for(int r=1;r<=slen;r++){
				c[l+r-1]=x[l]*s[r];
				c[l+r]+=c[l+r-1]/10;
				c[l+r-1]%=10;
			}
		}
		int k;
		for(k=10000;k>=1&&c[k]==0;k--);
		int clen=k;
		for(k=10000;k>=1&&ans[k]==0;k--);
		int anslen=k;
		//printf("q%d %dq",anslen,clen);
		for(int i=1;i<=max(anslen,clen);i++){
			ans[i]=ans[i]+c[i];
			ans[i+1]+=ans[i]/10;
			ans[i]%=10;
		}
		for(int i=1;i<=clen;i++){
			x[i]=c[i];
		}
		xlen=clen;
		memset(c,0,sizeof(c));
		/*
		cout<<endl;
		for(k=100;k>=1&&ans[k]==0;k--);
		for(k;k>=1;k--){
			cout<<ans[k];
		}
		*/
	}
	int k;
	for(k=10000;k>=1&&ans[k]==0;k--);
	for(k;k>=1;k--){
		cout<<ans[k];
	}
}

回复

3 条回复,欢迎继续交流。

正在加载回复...