洛谷 P1045 麦森数(高精,位数公式)

オリジナルタイトルリンクします。https://www.luogu.com.cn/problem/P1045

2シークPを最終500ビット(P <310万)-1の

高精度の前の出会いは大法が良いのpythonている
C高精度について書いて、書き込みに初めて、ピットの多くを踏ん
この問題は、高精度、迅速な乗算+パワーです

Qは、式の中央値を見つけるために使用することができる第1の小ビット求めて
+ +1 K = log10の(N)を
2 P -1及び2つのPの直接2つのシークのでビットが同じであるPのビットを
LOG10 (2 P)= P * loglO(2)

コード:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll a[1010],s[1010],t[1010];
void result1()
{
    memset(t,0,sizeof(t));
    for(int i=1;i<=500;i++)
    {
        for(int j=1;j<=500;j++)
        {
            t[i+j-1]+=s[i]*a[j];
        }
    }
    for(int i=1;i<=500;i++)
    {
        t[i+1]+=t[i]/10;
        t[i]%=10;
        s[i]=t[i];
    }
}
void result2()
{
    memset(t,0,sizeof(t));
    for(int i=1;i<=500;i++)
    {
        for(int j=1;j<=500;j++)
        {
            t[i+j-1]+=a[j]*a[i];
        }
    }
    for(int i=1;i<=500;i++)
    {
        t[i+1]+=t[i]/10;
        t[i]%=10;
        a[i]=t[i];
    }
}
int main()
{
    ll p;
    cin>>p;
    ll kk=p*log10(2)+1;
    s[1]=1;a[1]=2;
    while(p)
    {
        if(p&1)
        {result1();}
        result2();
        p/=2;
    }
    s[1]--;
    cout<<kk<<endl;
    for(int i=1;i<=500;i++)
    {
        int c=500-i+1;
        if(i%50==0)
        {cout<<s[c]<<endl;}
        else
        {cout<<s[c];}
    }
    return 0;
}

公開された36元の記事 ウォンの賞賛4 ビュー1391

おすすめ

転載: blog.csdn.net/qq_43781431/article/details/104562860