littlejohn @ 2024-03-26 15:33:04
#include<bits/stdc++.h>
using namespace std;
struct bignum{
char s[20000];
int num[20000];
int len,flag;
bignum(){
memset(num,0,sizeof(num));
len=1;
flag=0;
}
bignum(int x){
for(len=1;x;len++){
num[len]=x%10;
x/=10;
}
len--;
}
int &operator[](int i){
return num[i];
}
friend bool operator <(bignum a,bignum b){
if(a.len != b.len){
return a.len<b.len;
}
for(int i=a.len;i>=1;i--){
if(a[i]<b[i])return true;
if(a[i]>b[i])return false;
}
return false;
}
void input(){
scanf("%s",s+1);
len = strlen(s+1);
for(int i=1;i<=len;i++)
num[i] = s[len-i+1]-'0';
}
void print(){
if(flag)cout<<'-';
for(int i=len;i>=1;i--)cout<<num[i];
}
};
bignum operator+(bignum a,bignum b){
bignum ans;
ans.len = max(a.len,b.len);
for(int i=1;i<=ans.len;i++){
ans[i] += a[i]+b[i];
if(ans[i] >= 10){
ans[i+1]++;
ans[i]-=10;
}
}
if(ans[ans.len + 1]){
ans.len++;
}
return ans;
}
bignum operator-(bignum a,bignum b){
bignum ans;
if(a<b){
ans.flag=1;
swap(a,b);
}
ans.len = a.len;
for(int i=1;i<=ans.len;i++){
ans[i] += a[i]-b[i];
if(ans[i] < 0){
ans[i+1]--;
ans[i]+=10;
}
}
while(ans.len > 1 && ans[ans.len +1]==0)ans.len--;
return ans;
}
bignum operator*(bignum a,bignum b){
bignum ans;
ans.len = a.len+b.len;
for(int i=1;i<=a.len;i++){
for(int j=1;j<=b.len;j++)
ans[i+j-1] += a[i]*b[j];
}
for(int i=1;i<=ans.len;i++){
if(ans[i]>=10){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
}
while(ans.len > 1 && ans[ans.len]==0)ans.len--;
return ans;
}
bignum j(bignum a){
bignum ans=1;
for(bignum i=1;i<a+1;i=i+1){
ans = ans*i;
}
return ans;
}
int main(){
bignum a,ans;
a.input();
for(bignum i=1;i<a+1;i=i+1){
ans = ans+j(i);
}
ans.print();
cout<<endl;
return 0;
}
输入:22