高精度快速幂(乘法)

取后500位

struct node
{
    int n[516],l;
};
node mul(node &a,node &b)
{
    node c;
    memset(c.n,0,sizeof(c.n));
    for(int i=1;i<=b.l;++i)
        for(int j=1;j<=a.l;++j)
    {
        if(i+j-1>500)
        break;
        c.n[i+j-1]+=a.n[j]*b.n[i];
    }
    c.l=min(a.l+b.l-1,500);
    for(int i=1;i<=c.l;++i)
    {
    c.n[i+1]+=c.n[i]/10;
    c.n[i]%=10;
    }
    while(c.l<=500&&c.n[c.l+1])
    {
    c.l++;
    c.n[c.l+1]+=c.n[c.l]/10;
    c.n[c.l]%=10;
    }
    return c;
}
node Pow(int y)
{
    node b,a;
    memset(b.n,0,sizeof(b.n));
    memset(a.n,0,sizeof(a.n));
    b.l=1;b.n[1]=1;
    a.l=1;a.n[1]=2;
    while(y)
    {
        if(y&1)
        b=mul(b,a);
        a=mul(a,a);
        y>>=1;
    }
    return b;
}

 

你可能感兴趣的:(数论)