C++:
方法一:
#include<iostream>
using namespace std;
string a[60]={"0","1","3","9","33","153","873","5913","46233","409113","4037913","43954713","522956313","6749977113","93928268313","1401602636313","22324392524313","378011820620313","6780385526348313","128425485935180313","2561327494111820313","53652269665821260313","1177652997443428940313","27029669736328405580313","647478071469567844940313","16158688114800553828940313","419450149241406189412940313","11308319599659758350180940313","316196664211373618851684940313","9157958657951075573395300940313","274410818470142134209703780940313","8497249472648064951935266660940313","271628086406341595119153278820940313","8954945705218228090637347680100940313","304187744744822368938255957323620940313","10637335711130967298604907294846820940313","382630662501032184766604355445682020940313","14146383753727377231082583937026584420940313","537169001220328488991089808037100875620940313","20935051082417771847631371547939998232420940313","836850334330315506193242641144055892504420940313","34289376947494122614363304694584807557656420940313","1439295494700374021157505910939096377494040420940313","61854558558074209658512637979453093884758552420940313","2720126133346522977702138448994068984204397080420940313","122342346998826717539665299944651784048588130840420940313","5624964506810915667389970728744906677010239883800420940313","264248206017979096310354325882356886646207872272920420940313","12678163798554051767172643373255731925167694226950680420940313","620960027832821612639424806694551108812720525606160920420940313","31035053229546199656252032972759319953190362094566672920420940313"};
int main()
{
int n;
cin>>n;
cout<<a[n];
}
方法二:
#include <bits/stdc++.h>
using namespace std;
namespace Bignum
{
#define bit 18/*You can change sth here.*/
#if bit<=4
typedef int Type;
#else
typedef long long Type;
#endif
typedef long long ll;
const ll bit_pow[20]={1,(ll)10,(ll)1e2,(ll)1e3,(ll)1e4,(ll)1e5,(ll)1e6,(ll)1e7,(ll)1e8,(ll)1e9,(ll)1e10,(ll)1e11,(ll)1e12,(ll)1e13,(ll)1e14,(ll)1e15,(ll)1e16,(ll)1e17,(ll)1e18};
template <typename TP> inline void read(TP &n)
{
TP w=1;char x=getchar();n=0;
while(x<'0'||x>'9'){if(x=='-')w=-1;x=getchar();}
while(x>='0'&&x<='9'){n=(n<<1)+(n<<3)+(x^48);x=getchar();}
n*=w;
}
template <typename TP> inline void write(TP x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
template <typename TP,typename...Etc>
inline void read(TP &n,Etc &...etcs){read(n);read(etcs...);}
/*BIGNUM*/
class bignum;
bignum abs(const bignum &);
bignum operator - (bignum);
bool operator ! (const bignum &);
bool operator < (const bignum &,const bignum &);
bool operator > (const bignum &,const bignum &);
bool operator <= (const bignum &,const bignum &);
bool operator >= (const bignum &,const bignum &);
bool operator == (const bignum &,const bignum &);
bool operator != (const bignum &,const bignum &);
bignum operator + (const bignum &,const bignum &);
bignum operator - (const bignum &,const bignum &);
bignum operator * (const bignum &,const bignum &);
bignum operator / (const bignum &,const ll &);
bignum operator % (const bignum &,const ll &);
bignum operator += (bignum &,const bignum &);
bignum operator -= (bignum &,const bignum &);
bignum operator *= (bignum &,const bignum &);
bignum operator /= (bignum &,const ll &);
bignum operator %= (bignum &,const ll &);
struct bignum
{
vector <Type> s;
bool negative;
bignum() {clear();s.push_back(0);}
void clear() {negative=false;s.clear();}
void input(char k=' ') {clear();int rest=0;do{k=getchar();if(k=='-')negative=true;}while(k<'0'||k>'9');while(k>='0'&&k<='9'){if(!rest)s.push_back(0);*(--s.end())=*(--s.end())*10+k-'0';if(++rest==bit)rest=0;k=getchar();}rest+=(!rest)*bit;for(int i=s.size()-1;i>=1;i--){s[i]+=(s[i-1]%bit_pow[bit-rest]*bit_pow[rest]);s[i-1]/=bit_pow[bit-rest];}reverse();del();}
void output() {if(negative) putchar('-');write(s[s.size()-1]);for(int i=s.size()-2,put;i>=0;i--){put=bit-get(s[i]);while(put-->0)putchar('0');write(s[i]);}}
void reverse() {for(int i=0;i<(s.size()>>1);i++){swap(s[i],s[s.size()-i-1]);}}
void del() {while(s.size()>1&&!(*(--s.end()))) s.pop_back();if(zero()) negative=false;}
int get(Type x) {int cnt=0;while(x){x/=10;++cnt;}return cnt+(!cnt);}
int size() {return s.size();}
int length() {return bit*(s.size()-1)+get(s[s.size()-1]);}
bool odd() {return s[0]&1;}
bool zero() {return (!s[0])&&(s.size()==1);}
ll number() {ll K=0;for(int i=s.size()-1;i>=0;i--) K=K*bit_pow[bit]+s[i];return negative?-K:K;}
bignum(const char x) {*this=x;}
bignum(const char *x) {*this=x;}
bignum(const string x) {*this=x;}
bignum(const unsigned long long x) {*this=x;}
bignum(const unsigned int x) {*this=x;}
bignum(const unsigned short x) {*this=x;}
bignum(const long long x) {*this=x;}
bignum(const int x) {*this=x;}
bignum(const short x) {*this=x;}
bignum operator = (const char x) {clear();s.push_back(x-'0');return *this;}
bignum operator = (const char *x) {clear();int len=strlen(x);int rest=len%bit;s.resize((len/bit)+(len%bit!=0));rest+=(!rest)*bit;int CJB=s.size()-1;for(int i=0;i<len;i++){s[CJB]=(s[CJB]<<1)+(s[CJB]<<3)+(x[i]-'0');if(!(--rest))CJB--,rest=bit;}del();return *this;}
bignum operator = (const string x) {clear();int len=x.size( );int rest=len%bit;s.resize((len/bit)+(len%bit!=0));rest+=(!rest)*bit;int CJB=s.size()-1;for(int i=0;i<len;i++){s[CJB]=(s[CJB]<<1)+(s[CJB]<<3)+(x[i]-'0');if(!(--rest))CJB--,rest=bit;}del();return *this;}
bignum operator = (unsigned long long x){clear();do{s.push_back(x%bit_pow[bit]);}while(x/=bit_pow[bit]);return *this;}
bignum operator = (unsigned int x) {clear();do{s.push_back(x%bit_pow[bit]);}while(x/=bit_pow[bit]);return *this;}
bignum operator = (unsigned short x) {clear();do{s.push_back(x%bit_pow[bit]);}while(x/=bit_pow[bit]);return *this;}
bignum operator = (long long x) {clear();negative=(x<0);x=std::abs(x);do{s.push_back(x%bit_pow[bit]);}while(x/=bit_pow[bit]);return *this;}
bignum operator = (int x) {clear();negative=(x<0);x=std::abs(x);do{s.push_back(x%bit_pow[bit]);}while(x/=bit_pow[bit]);return *this;}
bignum operator = (short x) {clear();negative=(x<0);x=std::abs(x);do{s.push_back(x%bit_pow[bit]);}while(x/=bit_pow[bit]);return *this;}
bignum operator ++ () {return *this+=1,*this;}
bignum operator ++ (int) {return *this+=1,*this-1;}
bignum operator -- () {return *this-=1,*this;}
bignum operator -- (int) {return *this-=1,*this+1;}
};
bignum operator - (bignum x) {x.negative^=(!x.zero()); return x;}
bool operator ! (const bignum &x) {return x.s[0]==0&&x.s.size()==1;}
bool operator < (const bignum &x,const bignum &y) {if(x.negative!=y.negative)return x.negative;if(x.s.size()!=y.s.size()) return (x.s.size()<y.s.size())^x.negative;for(int i=x.s.size()-1;i>=0;i--)if(x.s[i]!=y.s[i])return (x.s[i]<y.s[i])^x.negative;return false;}
bool operator > (const bignum &x,const bignum &y) {return y<x;}
bool operator <= (const bignum &x,const bignum &y) {return !(y<x);}
bool operator >= (const bignum &x,const bignum &y) {return !(x<y);}
bool operator == (const bignum &x,const bignum &y) {if(x.negative!=y.negative||x.s.size()!=y.s.size())return false;for(int i=x.s.size()-1;i>=0;i--)if(x.s[i]!=y.s[i])return false;return true;}
bool operator != (const bignum &x,const bignum &y) {return !(x==y);}
static bignum plus(const bignum &x,const bignum &y)
{
bignum ANS;
ANS.s.resize(max(x.s.size(),y.s.size())+1);
short tag=0;
for(int i=0;i<ANS.s.size();i++)
{
ANS.s[i]=tag;
if(i<x.s.size()) ANS.s[i]+=x.s[i];
if(i<y.s.size()) ANS.s[i]+=y.s[i];
tag=(ANS.s[i]>=bit_pow[bit]);
ANS.s[i]-=bit_pow[bit]*tag;
}
ANS.del();
return ANS;
}
static bignum minus(const bignum &x,const bignum &y)
{
bignum ANS;
ANS.s.resize(max(x.s.size(),y.s.size()));
short tag=0;
for(int i=0;i<ANS.s.size();i++)
{
ANS.s[i]=tag;
if(i<x.s.size()) ANS.s[i]+=x.s[i];
if(i<y.s.size()) ANS.s[i]-=y.s[i];
tag=-(ANS.s[i]<0);
ANS.s[i]-=bit_pow[bit]*tag;
}
ANS.del();
return ANS;
}
bignum operator + (const bignum &x,const bignum &y)
{
bignum ANS;
if(x.negative==y.negative)
ANS=plus(x,y),ANS.negative=x.negative;
else
ANS=minus(max(abs(x),abs(y)),min(abs(x),abs(y))),ANS.negative=(x.negative&&abs(x)>abs(y))||(!x.negative&&abs(y)>abs(x));
return ANS;
}
bignum operator - (const bignum &x,const bignum &y)
{
bignum ANS;
if(x.negative!=y.negative)
ANS=plus(x,y),ANS.negative=x.negative;
else
ANS=minus(max(abs(x),abs(y)),min(abs(x),abs(y))),ANS.negative=(x.negative&&abs(x)>abs(y))||(!x.negative&&abs(y)>abs(x));
return ANS;
}
bignum operator * (const bignum &x,const bignum &y)
{
bignum ANS;
ANS.s.resize(x.s.size()+y.s.size());
ANS.negative=x.negative^y.negative;
for(int i=0;i<ANS.s.size();i++)
ANS.s[i]=0;
for(int i=0;i<x.s.size();i++)
{
for(int j=0;j<y.s.size();j++)
{
ANS.s[i+j]+=x.s[i]*y.s[j];
ANS.s[i+j+1]+=ANS.s[i+j]/bit_pow[bit];
ANS.s[i+j]%=bit_pow[bit];
}
}
ANS.del();
return ANS;
}
bignum operator / (const bignum &x,const ll &y)
{
bignum ANS;
ANS.s.resize(x.s.size());
ANS.negative=(x.negative)^(y<0);
ll Klee=0;
for(int i=x.s.size()-1;i>=0;i--)
{
Klee=Klee*bit_pow[bit]+x.s[i];
ANS.s[i]=Klee/y;
Klee%=y;
}
ANS.del();
return ANS;
}
bignum operator % (const bignum &x,const ll &y)
{
ll Klee=0;
for(int i=x.s.size()-1;i>=0;i--)
{
Klee=Klee*bit_pow[bit]+x.s[i];
Klee%=y;
}
return x.negative?-Klee:Klee;
}
bignum operator += (bignum &x,const bignum &y) {return x=x+y;}
bignum operator -= (bignum &x,const bignum &y) {return x=x-y;}
bignum operator *= (bignum &x,const bignum &y) {return x=x*y;}
bignum operator /= (bignum &x,const ll &y) {return x=x/y;}
bignum operator %= (bignum &x,const ll &y) {return x=x%y;}
#ifdef _GLIBCXX_IOSTREAM
istream& operator >> (istream& in,bignum &x) {x.input();return in;}
ostream& operator << (ostream& out,bignum x) {x.output();return out;}
#endif
inline void read(bignum &x) {x.input();}
inline void write(bignum x) {x.output();}
bignum abs(const bignum &x) {return x.negative?-x:x;}
}
using namespace Bignum;
int main()
{
bignum n;
cin >> n;
bignum sum = 0,m = 1;
for(int i = 1;i <= n;i++)
{
m *= i;
sum += m;
}
cout << sum << endl;
return 0;
}