快速幂

 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 909529;
int a[maxn],rec[maxn],b[maxn];
int lena = 1, len = 1, n;

void multim()
{
    memset(b, 0, sizeof(b));
    for (int i = 1; i <= lena; i++)
    {
        for (int j = 1; j <= lena; j++)
        {
            b[i + j - 1] += a[i] * a[j];
            b[i + j] += b[i + j - 1] / 10;
            b[i + j - 1] %= 10;
        }
    }
    lena = lena + lena;
    //cout << lena << endl;
    while (lena!=1&&!b[lena])
        lena--;
    if (lena > 500) lena = 500;
    for (int i = 1; i <= lena;i++) a[i] = b[i];
}
void multi()
{
    memset(b, 0, sizeof(b));
    for (int i = 1; i <= len; i++)
    {
        for (int j = 1; j <= lena; j++)
        {
            b[i + j - 1] += rec[i] * a[j];
            b[i + j] += b[i + j - 1] / 10;
            b[i + j - 1] %= 10;
        }
    }
    len = len + lena;
    while (len!=1&&!b[len])len--;
    if (len > 500) len = 500;
    for (int i = 1; i <= len; i++)
    {
        //printf("rec[%d]当前的值是%d,b[%d]当前的值是%d\n", i,rec[len],i, b[len]);
        rec[i] = b[i];
    }
}
void modpow()
{
    //快速幂
    while (n)
    {
        if (n & 1) multi();
        multim();
        n >>= 1;
    }
}
int main(void)
{
    rec[1] = 1;
    a[1] = 2;
    cin >> n;
    printf("%d\n", int(n * log10(2.0) + 1));
    modpow();
    rec[1]--;
    //printf("%d\n", len);
    for (int i = 500; i >= 1; i--)
    {
        printf("%d", rec[i]);
        if (!((i - 1) % 50))puts("");
    }
    return 0;
}

 

posted @ 2021-03-09 16:57  loliconsk  阅读(52)  评论(1)    收藏  举报