• 20200802 高精度问题 阶乘之和


    模板 来源https://societyniu.blog.luogu.org/solution-p1009

    #include<iostream>
    #include<bits/stdc++.h>
    using namespace std;
    int a[2000];
    int b[2000];
    int c[2000];
    int sum[2000];
    void pplus(int *a,int *c)
    {
        int jw=0;
        for(int i=1;i<=1000;i++)
        {
            c[i]+=a[i]+jw;
            jw=c[i]/10;
            c[i]%=10;
        }
    }
    void cheng(int *a,int c)
    {
        int jw=0;
        for(int i=1;i<=1000;i++)
        {
            a[i]=a[i]*c+jw;
            jw=a[i]/10;
            a[i]%=10;
        }
    }
    int main()
    {
        int n;
        cin>>n;
        a[1]=1;
        for(int i=1;i<=n;i++)
        {
            cheng(a,i);
            pplus(a,c);
        }
        bool flag=0;
        for(int i=1000;i>=1;i--)
        {
            if(c[i]!=0) flag=1;
            if(flag) cout<<c[i];
        }
    }

    自己写的辣鸡代码

    #include <bits/stdc++.h>
    #define RG register int
    #define rep(i,a,b)    for(RG i=a;i<=b;++i)
    #define per(i,a,b)    for(RG i=a;i>=b;--i)
    #define ll long long
    #define inf (1<<29)
    using namespace std;
    const int maxn=1e5+5;
    int a[51][maxn],vis[maxn],mins=1e9,p[52]={1},maxp=1;
    int n,flag,coun;
    inline int read(){
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    inline void count(int n){
        memset(a[n],0,sizeof(a[n]));
        a[n][0]=120;
        for(int i=6;i<=n;i++)
        {
                for(int j=0;j<maxn;j++)
                {
                    a[n][j]*=i;
                    if(!a[n][j+1])break;
                    //cout<<a[j]<<endl;
                }
                if(i%5==0 || i>45)
                {
                    for(int j=0;j<maxn;j++)
                        if(a[n][j]!=0){
                            if(a[n][j]%10!=0)
                            {
                                a[n][j+1]+=a[n][j]/10;
                                a[n][j]=a[n][j]%10;
                                //cout<<1<<endl;
                            }
                            else
                            {
                                a[n][j+1]+=a[n][j]/10-1;
                                a[n][j]=10;
                            }
                        }
                }
            }
        //cout<<a[0]<<endl;
        for(int i=0;i<maxn;i++)
        {
            a[n][i+1]+=a[n][i]/10;
            a[n][i]=a[n][i]%10;
            if(!a[n][i+1])break;
            p[n]=i+1;
            //cout<<a[i]<<' '<<a[i+1]<<endl;
        }
        //if(!a[n][p[n]])p[n]--;
        maxp=max(maxp,p[n]);
    }
    
    int main()
    {
        int n,sum[maxn]={0};cin>>n;
        a[1][0]=1;a[2][0]=2;a[3][0]=6;a[4][0]=24;a[5][0]=120;
        for(int j=6;j<=n;j++)count(j);
        for(int i=0;i<=maxp;i++)
            for(int j=1;j<=n;j++)
                sum[i]+=a[j][i];//cout<<sum[i]<<endl;
        for(int i=0;i<maxn;i++)
        {
            sum[i+1]+=sum[i]/10;
            sum[i]=sum[i]%10;
            if(!sum[i+1])break;
            flag=i+1;
        }
        //while(!sum[flag])flag--;
        //for(int j=1;j<=n;j++){cout<<j<<' ';for(int i=0;i<=p[j];i++)cout<<a[j][p[j]-i];cout<<endl;}
        for(int i=0;i<=flag;i++)cout<<sum[flag-i];
        return 0;
    }
  • 相关阅读:
    用原生JS写根据时间显示问候语
    用原生JS写洗扑克牌
    rabbitmq系列——(0 导航)
    rabbitmq系列——(0 Windows下安装)
    rabbitmq系列——(1生产者消费者点对点)
    rabbitmq系列——(2 多生产多消费)
    rabbitmq系列——(3 优先级 )
    rabbitmq系列——(4 Exchange Type -- Direct)
    rabbitmq系列——(4 Exchange Type -- Fanout)
    rabbitmq系列——(4 Exchange Type -- Topic)
  • 原文地址:https://www.cnblogs.com/tabshh/p/13431358.html
Copyright © 2020-2023  润新知