记录编号 548957 评测结果 AAAAAAAAAA
题目名称 [NOIP 1998]阶乘之和 最终得分 100
用户昵称 Gravatar锝镆氪锂铽 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2020-02-03 18:10:26 内存使用 0.00 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

void multi(int sum[],int x);
void print(int a[]);
void add(int a[],int b[],int c[]);
void clone(int a[],int b[]);

int fa(){
	freopen("factoriall.in","r",stdin);
	freopen("factoriall.out","w",stdout);
	int sum[40000],a[40000],b[40000],n,j=1;
	scanf("%d",&n);
	memset(a,0,sizeof(a));
	memset(a,0,sizeof(a));
	while(j<=n){
		memset(sum,0,sizeof(sum));
		sum[1]=1;sum[0]=1;
		for(int i=1;i<=j;i++){
			multi(sum,i);
		}
		add(sum,a,b);
		clone(b,a);
		j++;
	}
	print(b);
	return 0;
}

int lol=fa();
int main(void){;}

void multi(int sum[],int x){
    int res=0;//进阶
    for(int i=1; i<=sum[0]; ++i)
    {
        int temp=sum[i]*x+res;
        sum[i]=temp%10;
        res=temp/10;
    }
    while(res)
    {
        sum[++sum[0]]=res%10;
        res/=10;
    }
}

void print(int a[]){
	for(int i=a[0];i>=1;i--){
		printf("%d",a[i]);
	}
	printf("\n");
}

void add(int a[],int b[],int c[])
{
	int carry=0,cur=1;
	while(cur<=a[0]||cur<=b[0])
	{
		c[cur]=(a[cur]+b[cur]+carry)%10;
		carry=(a[cur]+b[cur]+carry)/10;
		++cur;
	}
	c[cur]=carry;
	if(c[cur]==0)--cur;
	c[0] = cur;
}

void clone(int a[],int b[]){
	for(int i=0;i<=a[0];i++){
		b[i]=a[i];
	}
}