萌新求助

回复帖子

@ThinkofBlank 2019-08-14 16:47 回复
#include<bits/stdc++.h>
using namespace std;
const int N=1000001;
const long long T=1e17;
string res[10001];
struct node{
    int w,e;
}t[N];
inline bool kkk(node x,node y){
    return x.w<y.w;
}
inline string operator*(string x,long long y){
    long long a[100001],len=x.size();
    for(int i=0;i<len;++i){
        a[i]=x[len-i-1]-'0';
        a[i]*=y;
    }
    a[len]=a[len+1]=a[len+2]=a[len+3]=a[len+4]=a[len+5]=0;
    for(int i=0;i<len;++i){
        if(a[i]>9){
            a[i+1]+=a[i]/10,a[i]%=10;
            if(i==len-1){
                ++len;
            }
        }
    }
    while(len-1&&!a[len-1]){
        --len;
    }
    string ret="";
    for(int i=len-1;~i;--i){
        ret+=char(a[i]+'0');
    }
    return ret;
}
int main(){
    int e=0,x;
    while(~scanf("%d",&x)){
        ++e;t[e].e=e,t[e].w=x;
    }
    sort(t+1,t+e+1,kkk);
    int now=1;string mul="1";long long Mul=1;
    for(int i=1;i<=t[e].w;++i){
        if(i==t[now].w){
            Mul*=i;
            mul=mul*Mul;Mul=1;
            res[t[now++].e]=mul;
            while(i==t[now].w){
                res[t[now++].e]=mul;
            }
        }else{
            if(T/Mul<i){
                mul=mul*Mul;Mul=i;
            }else{
                Mul*=i;
            }
        }
    }
    for(int i=1;i<=e;++i){
        cout<<res[i]<<'\n';
    }
    return 0;
}

这是一个普通的求N的阶乘的代码,N<=10000

然后,本蒟蒻发现,我们如果将高精里面的ret+=char(a[i]+'0');

改为

ret=ret+char(a[i]+'0');

速度会慢到极值。。。大概是从500ms左右飚到23s左右。。。十分震惊,请问这是为什么呢?

反馈
如果你认为某个帖子有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。