luogu 1045 麦森数
题目大意:
从文件中输入P(1000<P<3100000),计算2^P−1的位数和最后500位数字(用十进制高精度数表示)
思路:
一道高精度练习题
其中位数是一个结论 位数=[P*log2]+1
然后就是高精度,因为作死的压位打了好久
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 2139062143 10 #define ll long long 11 #define MAXN 6010 12 #define MOD 10000 13 using namespace std; 14 inline int read() 15 { 16 int x=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 18 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 19 return x*f; 20 } 21 int n; 22 struct bign 23 { 24 int len,num[125]; 25 bign(){len=0;memset(num,0,sizeof(num));} 26 void Print() 27 { 28 for(int i=124;i>0;i--) 29 if(i%25==12) printf("%02d\n%02d",num[i]/100,num[i]%100); 30 else if(i%25==0) printf("%04d\n",num[i]); 31 else printf("%04d",num[i]); 32 printf("%04d",num[0]-1); 33 } 34 }; 35 bign mul(bign a,bign b) 36 { 37 bign res;int t; 38 //cout<<"a: ";a.Print();cout<<"b: ";b.Print(); 39 for(int i=0;i<=a.len;i++) 40 for(int j=0;j<=b.len;j++) 41 { 42 t=a.num[i]*b.num[j]; 43 if(i+j<=124) 44 if(i+j<124) res.num[i+j]+=t,res.num[i+j+1]+=res.num[i+j]/MOD,res.num[i+j]%=MOD; 45 else res.num[i+j]+=t,res.num[i+j]%=MOD; 46 } 47 for(int i=0;i<=124;i++) 48 if(res.num[i]) res.len=i; 49 return res; 50 } 51 void q_pow() 52 { 53 bign ans,t;ans.num[0]=1,t.num[0]=2; 54 while(n) 55 { 56 if(n&1) ans=mul(ans,t); 57 t=mul(t,t); 58 n>>=1; 59 } 60 ans.Print(); 61 } 62 int main() 63 { 64 n=read(); 65 printf("%d\n",(int)(n*0.30103)+1); 66 q_pow(); 67 }