pts90高精度快速幂求助
查看原帖
pts90高精度快速幂求助
945364
LiJoQiao楼主2023/8/15 18:33
#include<bits/stdc++.h>
using namespace std;
const int MAXLEN=500+10;
struct bigint
{
    int len,a[MAXLEN];
    bigint(){memset(a,0,sizeof(a));len=1;}
    void print()
    {
        for(int i=9;i>=0;--i)
        {
            for(int j=50;j;--j)
            {
                int tlen=i*50+j;
                cout<<a[tlen];
            }
            cout<<'\n';
        }
    }
}ans2,m2;
bigint fix(bigint a)
{
	while(a.a[a.len+1])++a.len;
    for(int i=1;i<a.len;i++)
    {
        if(a.a[i]<0)
        {
            --a.a[i+1];
            a.a[i]+=10;
        }
        a.a[i+1]+=a.a[i]/10;
        a.a[i]%=10;
    }
    while(a.a[a.len]>=10)
    {
        a.a[a.len+1]+=a.a[a.len]/10;
        a.a[a.len]%=10;
        ++a.len;
    }
    return a;
}
bigint operator*(bigint a,bigint b)
{
    bigint c;
    int alen=min(500,a.len);
    for(int i=1;i<=alen;i++)
    {
        int blen=min(500-i+1,b.len);
        for(int j=1;j<=blen;j++)
        {
            c.a[i+j-1]+=a.a[i]*b.a[j];
        }
    }
    return fix(c);
}
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int P;cin>>P;
    int ans1=log10(2)*P+1;
    cout<<ans1<<'\n';
    m2.a[1]=2;
    ans2.a[1]=1;
    while(P)
    {
        if(P&1)
        {
            ans2=ans2*m2;
        }
        m2=m2*m2;
        P>>=1;
    }
    --ans2.a[1];
    ans2=fix(ans2);
    ans2.print();
    return 0;
}
2023/8/15 18:33
加载中...