洛谷P1009 [NOIP1998 普及组] 阶乘之和 题解

题目

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿Eason

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值