求大佬讲解思路

P1045 [NOIP2003 普及组] 麦森数

hngc201912211121 @ 2019-11-21 13:01:26

本人大一萌新,刚学c俩月,c++都没学,就被ACM的学长整来做这种题,脑壳疼,绝望,无助,求大佬解答思路, 希望用c来解答。


by 星际联盟 @ 2020-02-08 13:15:37

->用结构体(偷懒的我~

高精度源码

#include <bits/stdc++.h>
#define re register
using namespace std;
const int N=1010;
int p;
struct bigint{
    char in[N];
    int out[N],len;
    bigint(){memset(out,0,sizeof(out));}
    void scan()&
    {
        scanf("%s",in);
        len=strlen(in);
        for(re int i =0;i<len;i++)
            out[len-i-1]=in[i]^48;
        return ;
    }
    void print()&
    {
        for(re int i=1,k=len-1;i<=10;i++)
        {
            for(re int j=1;j<=50;j++,k--)
                printf("%d",out[k]);
            puts("");
        }
        return ;
    }
    bigint operator*(bigint &W)&
    {
        bigint res;
        res.len=500;
        for(re int i=0;i<500;i++)
            for(re int j=0;j<500;j++)
                res.out[i+j]+=out[i]*W.out[j];
        for(re int i=0;i<res.len;i++)
            if(res.out[i]>=10)
            {
                res.out[i+1]+=res.out[i]/10;
                res.out[i]%=10;
            }
        return res;
    }
    void operator=(bigint W)&
    {
        len=W.len;
        for(re int i =0;i<len;i++)
            out[i]=W.out[i];
        return ;
    }
};
bigint a,ansp;
void qmi()
{
    ansp.out[0]=1;
    for(a.out[0]=2;p;a=(a*a),p>>=1)
        if(p&1) ansp=(ansp*a);
    ansp.out[0]--;
    return ;
}
int main()
{
    scanf("%d",&p);
    printf("%d\n",(int)((double)p*log10(2)+1));
    qmi();
    ansp.print();
    return 0;
} 

by 星际联盟 @ 2020-02-08 13:23:24

高精度模板

#include <bits/stdc++.h>
#define re register
using namespace std;
const int N=3010;
struct bigint{
    char in[N];
    int out[N],len;
    bigint(){memset(out,0,sizeof(out));}
    void scan()&
    {
        scanf("%s",in);
        len=strlen(in);
        for(re int i =0;i<len;i++)
            out[len-i-1]=in[i]^48;
        return ;
    }
    void print()&
    {
        while(len>1 && !out[len-1]) len--;
        for(re int i =len-1;i>=0;i--)
            printf("%d",out[i]);
        puts("");
        return ;
    }
    bigint operator*(bigint &W)&
    {
        bigint res;
        res.len=W.len+len-1;
        for(re int i =0;i<len;i++)
            for(re int j=0;j<W.len;j++)
                res.out[i+j]+=out[i]*W.out[j];
        for(re int  i=0;i<res.len;i++)
            if(res.out[i]>=10)
            {
                res.out[i+1]+=res.out[i]/10;
                res.out[i]%=10;
            }
        if(res.out[res.len]) res.len++;
        return res;
    }
    bigint operator+(bigint &W)&
    {
        bigint res;
        res.len=max(len,W.len);
        for(re int i=0;i<res.len;i++)
            res.out[i]=W.out[i]+out[i];
        for(re int i =0;i<res.len;i++)
            if(res.out[i]>=10)
            {
                res.out[i+1]+=res.out[i]/10;
                res.out[i]%=10;
            }
        if(res.out[res.len]) res.len++;
        return res;
    }
    void operator=(bigint W)&
    {
        len=W.len;
        for(re int i=0;i<len;i++)
            out[i]=W.out[i];
        return ;
    }
};
int main()
{

    return 0;
}

|