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;}