2^n高精度模板(n<=16000)

来源:互联网 发布:wow60年代数据库 编辑:程序博客网 时间:2024/04/28 05:36
#include <cstdio>#include <cstring>typedef long long LL;#define mod 1000000000#define LENMAX 700///调试中最大n为16000int a[LENMAX];int b[LENMAX];LL dd[LENMAX<<1];int c[LENMAX];void Mul2(){    memset(dd,0,sizeof(dd));    memcpy(b,a,sizeof(a));    for(int i=0;i<LENMAX-5;i++)        for(int j=0;j<LENMAX-5;j++){        dd[i+j]+=(LL)a[i]*b[j];        if(dd[i+j]>mod){            dd[i+j+1]+=dd[i+j]/mod;            dd[i+j]%=mod;        }    }    for(int i=0;i<LENMAX;i++)        a[i]=dd[i];}void Mul1(){    memset(dd,0,sizeof(dd));    for(int i=0;i<LENMAX-5;i++)        for(int j=0;j<LENMAX-5;j++){        dd[i+j]+=(LL)a[i]*c[j];        if(dd[i+j]>mod){            dd[i+j+1]+=dd[i+j]/mod;            dd[i+j]%=mod;        }    }    for(int i=0;i<LENMAX;i++)        c[i]=dd[i];}void quick_Power(int k){    memset(a,0,sizeof(a));    memset(c,0,sizeof(c));    a[0]=2;c[0]=1;    int cnt=0;    while(k)    {        if(k&1) Mul1();        Mul2();        k>>=1;    }}void Power(int x){    quick_Power(x);    int j;    for(j=LENMAX-10;j>=0;j--)        if(c[j]!=0) break;    printf("%d",c[j]);    for(j--;j>=0;j--)        printf("%09d",c[j]);    printf("\n");}int main(){    int n;    while(~scanf("%d",&n))    {        Power(n);    }    return 0;}

原创粉丝点击