0分

P1009 [NOIP1998 普及组] 阶乘之和

wangyuzhe11 @ 2024-12-16 22:33:05

#include<bits/stdc++.h>
using namespace std;
#define db=double;
string is(int a){
    string s="";
    while(a>0){
        int k=a%10;
        s=(char)(k+'0')+s;
        a/=10;
    }
    return s;
}
string ans="",ans2="";
void add(string a,string b){
    int s1=a.size(),s2=b.size();
    string k="";
    int l=0;
    if(s2>=s1){
        for(int i=s1-1;i>=0;i--){
            int m1=a[i]-'0',m2=b[i-(s1-s2)]-'0';
            int x=m1+m2+l;
            if(x<10){
                l=0;
                k=(char)(x+'0')+k;
            }else{
                l=1;
                x-=10;
                k=(char)(x+'0')+k;
            }
        }
        for(int i=s2-s1-1;i>=0;i--){
            int m=b[i]-'0';
            int x=m+l;
            if(x<10){
                l=0;
                k=(char)(x+'0')+k;
            }else{
                l=1;
                k=(char)((x-10)+'0')+k;
            }
        }
        if(l==1)k='1'+k;
    }
    else{
        for(int i=s2-1;i>=0;i--){
            int m1=a[i-(s2-s1)]-'0',m2=b[i]-'0';
            int x=m1+m2+l;
            if(x<10){
                l=0;
                k=(char)(x+'0')+k;
            }else{
                l=1;
                x-=10;
                k=(char)(x+'0')+k;
            }
        }
        for(int i=s1-s2-1;i>=0;i--){
            int m=a[i]-'0';
            int x=m+l;
            if(x<10){
                l=0;
                k=(char)(x+'0')+k;
            }else{
                l=1;
                k=(char)((x-10)+'0')+k;
            }
        }
        if(l==1)k='1'+k;
    }
    for(int i=0;i<k.size();i++)ans[i]=k[i];
}
void fx(string a,string b){
    int l=0;
    int s1=a.size(),s2=b.size();
    string s="";
    if(s1<s2){
        swap(s1,s2);
        swap(a,b);
    }
    for(int i=0;i<s2;i++){
        for(int j=s1-1;j>=0;j--){
            int k1=(int)(b[i]-'0')*(int)(a[i]-'0');
            char k=(char)(k1+'0');
            if(k<10){
                if(l!=0){
                    l=0;
                    s=(char)(k+l-'0')+s;
                }
                else{
                    l=0;
                    s=(char)(k-'0')+s;
                }
            }else{
                if(l!=0){
                    l=k/10;
                    k%=10;
                    s=(char)(k+l-'0')+s;
                }else{
                    l=k/10;
                    k%=10;
                    s=(char)(k-'0')+s;
                }
            }
        }
        add(s,ans2);
        ans2=ans;
    }
}
string x="";
int n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        string a="1";
        for(int j=1;j<=i;j++){
            fx(is(j),a);
            a=ans2;
        }
        add(a,x);
        x=ans;
    } 
    for(int i=0;i<x.size();i++)cout<<x[i];
    return 0;
}

|