[NOIP1998 普及组] 阶乘之和
作者:
20过19
,
2024-04-21 14:39:00
,
所有人可见
,
阅读 12
高精度阶乘
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 55;
int n;
string f[N],s[N];
string fun(int x,string s){
string res;
int t=0;
reverse(s.begin(),s.end());
for(int i = 0;i < s.size();i ++){
int u = s[i]-'0';
int c=(u*x+t)%10;
t=(u*x+t)/10;
res+=(c+'0');
}
while(t){
res+=(t%10)+'0';
t/=10;
}
reverse(res.begin(),res.end());
return res;
}
string func(string a,string b){
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string res;
int t=0;
int i;
for(i = 0;i<a.size()&&i<b.size();i++){
int x=a[i]-'0';
int y=b[i]-'0';
int u=(x+y+t)%10;
if(x+y+t>=10)t=1;
else t=0;
res+=(u+'0');
}
while(i<a.size()){
int x=a[i]-'0';
res+=(x+t)%10+'0';
if(x+t>=10)t=1;
else t=0;
i++;
}
while(i<b.size()){
int x=b[i]-'0';
res+=(x+t)%10+'0';
if(x+t>=10)t=1;
else t=0;
i++;
}
reverse(res.begin(),res.end());
return res;
}
int main(){
cin>>n;
f[1]="1";
s[1]="1";
for(int i = 2;i <= n;i ++){
f[i]=fun(i,f[i-1]);
s[i]=f[i];
s[i]=func(s[i-1],s[i]);
}
//cout<<f[n]<<endl;
cout<<s[n];// 4037913
return 0;
}